我正在研究ubuntu 10.04和gcc。我有一个带有我自己的幻数的二进制文件。当我读取文件时,幻数不一样。溪流接缝是正确的。
写出幻数:
std::fstream chfile;
chfile.open(filename.c_str(), std::fstream::binary | std::fstream::out);
if (chfile.good())
{
chfile << (unsigned char)0x02 << (unsigned char)0x46 << (unsigned char)0x8A << (unsigned char)0xCE;
// other input
chfile.close();
}
阅读幻数:
std::fstream chfile;
chfile.open(filename.c_str(), std::fstream::binary | std::fstream::in);
if (chfile.good())
{
unsigned char a,b,c,d;
chfile >> a;
chfile >> b;
chfile >> c;
chfile >> d;
printlnn("header must : " << (int)0x02 << ' ' << (int)0x46 << ' ' << (int)0x8A << ' ' << (int)0xCE); // macro for debugging output
printlnn("header read : " << (int)a << ' ' << (int)b << ' ' << (int)c << ' ' << (int)d);
chfile.close();
}
当我使用02 46 8A CE作为幻数时,它没问题(如输出所示):
header must : 2 70 138 206
header read : 2 70 138 206
但是当我使用EA 50 0C C5时,输出为:
header must : 234 80 12 197
header read : 234 80 197 1
,最后一个1是下一个输入的合法值。那么为什么要区别他们以及如何解决这个问题呢?
答案 0 :(得分:3)
在第二种情况下,operator>>
正在跳过字符值12. operator>>
将12
识别为空格,并跳过它,搜索下一个有效字符。
尝试使用未格式化的输入操作(例如chfile.read()
或chfile.get()
)。
答案 1 :(得分:1)
您不应将<<
和>>
与二进制文件一起使用,它们用于格式化读写。
特别是,它们对空格进行特殊处理,例如0xC(即换页),这使得它们不适合二进制I / O.