ifstream提取运算符不工作

时间:2014-05-01 08:17:37

标签: c++ iostream

我正在尝试使用以下代码从二进制文件中读取数据:

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()读取此文件,但为什么给定的代码不起作用?

2 个答案:

答案 0 :(得分:1)

使用ios::binary标志并不一定意味着您可以读写二进制数据。看看https://stackoverflow.com/a/2225612/2372604ios::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"语言环境,因此没有代码翻译 发生。