我正在尝试使用以下代码从二进制文件中读取数据:
fstream s;
s.open(L"E:\\test_bin.bin", ios::in | ios::binary);
int c = 0;
while (!s.eof())
{
s >> c;
cout << c;
}
c始终为0(c的当前值。如果我将c设置为1,则结果为1)。文件存在且它的数据不是零,因此问题不在文件中。我可以使用fread并使用s.get()读取此文件,但为什么给定的代码不起作用?
答案 0 :(得分:1)
使用ios::binary
标志并不一定意味着您可以读写二进制数据。看看https://stackoverflow.com/a/2225612/2372604。 ios::binary
表示“在不翻译的情况下读取或写入数据......”
您可能想要做的是使用s.read(...)
。在你的情况下,流操作符尝试读取一个完整的整数(类似于“1234”),而不是X个符合整数的位。
对于读取4个字节,像folling这样的东西可能有效(未经测试):
int n;
while (s.read((char*) &n, 4) && s.gcount() != 0 ) {}
答案 1 :(得分:1)
出了什么问题:
int c = 0;
char ch;
int shift = 32;
while ( s.get( ch ) && shift != 0 ) {
shift -= 8;
c |= (ch & 0xFF) << shift;
}
if ( shift != 0 ) {
// Unexpected end of file...
}
这是(或多或少)读取二进制32位的标准方式
离开网络的整数。 (这假设原生int
是
当然是32位2的补码。)
某些协议使用32位整数的不同表示,并且 所以需要不同的代码。
至于原始代码:测试s.eof()
总是错误的,
>>
用于输入文字;特别是,它会跳过
前导空格(和二进制数据可能包含代码
对应于空白)。
我还可以补充一点,你应该确保流是
充满了"C"
语言环境,因此没有代码翻译
发生。