使用 ifstream 读取二进制数据

Read binary data using ifstream

可能我对ifstream一无所知。我有二进制文件:0604 0204 0a02。

std::ifstream input(input_filename, std::ios::binary);
unsigned char cmd;
unsigned char type;
while (!input.eof()) {
    input >> cmd;
    input >> type;
    std::cout << static_cast<int>(cmd) << " " << (int)type << "\n";
}

此代码的结果:

6 4
2 4
2 0

出了什么问题?

operator >> 正在跳过白色 space。您需要致电

while(input.read(&cmd, 1) && input.read(&type, 1)) {}

while(input >> std::noskipws >> cmd >> std::noskipws >> type) {}

另请注意更改后的错误检查(只是将流转换为 bool)。

这里有两个问题。

  1. 0x0A 是一个 ASCII 换行符,并且您正在使用格式化提取。这就是为什么您的 10 是 "skipped" 而 2 被提取出来的原因。

    使用.get(),而不是>>

  2. 您正在使用 .eof(),它不会检查提取错误,并且仅在您提取 之后检查,所以您在实际读取结束后得到 "extra" 错误数据(0 是无稽之谈)。 Don't use while (!stream.eof()) in a loop(通常)。

固定码:

#include <fstream>
#include <iostream>

int main()
{
    std::ifstream input(input_filename, std::ios::binary);
    while (true)
    {
        const unsigned char cmd = input.get();
        const unsigned char type = input.get();

        if (!input)
            break;

        std::cout << static_cast<int>(cmd) << " " << (int)type << "\n";
    }
}

/*
g++ -std=c++17 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
6 4
2 4
10 2
*/

live demo