使用 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)。
这里有两个问题。
0x0A
是一个 ASCII 换行符,并且您正在使用格式化提取。这就是为什么您的 10
是 "skipped" 而 2
被提取出来的原因。
使用.get()
,而不是>>
您正在使用 .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
可能我对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)。
这里有两个问题。
0x0A
是一个 ASCII 换行符,并且您正在使用格式化提取。这就是为什么您的10
是 "skipped" 而2
被提取出来的原因。使用
.get()
,而不是>>
您正在使用
.eof()
,它不会检查提取错误,并且仅在您提取 之后检查,所以您在实际读取结束后得到 "extra" 错误数据(0
是无稽之谈)。 Don't usewhile (!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
*/