无法从文件中读取简单的二进制整数? (C ++)

时间:2011-06-07 07:54:30

标签: c++ binary ifstream integer

我的代码就像这样:

已更新

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char **argv)
{
  ifstream r("foo.bin", ios::binary);
  ofstream w("foo.bin", ios::binary);
  int i;

  int ints[10] = {0,1,2,3,4,5,6,8,9};
  w.write((char*)&ints, sizeof(ints));

  int in_ints[10];
  r.read((char*)&in_ints, sizeof(in_ints));

  for(i = 0;i < 10;i++) {
    cout << in_ints[i] << " ";
  }
  cout << endl;

  return 0;
}

现在,写入部分似乎成功,例如运行32位长的od命令(我的系统是32位)将显示正确的序列,包括十六进制转储。

然而,读取时,我得到的随机序列和负整数不应该发生(它被拆分,并且大多数为零,因为我的整数很小,符号位不应该打开。)

你知道为什么我的read方法无法工作,当它与我的写方法完全相反时?

3 个答案:

答案 0 :(得分:7)

w.flush()之前尝试w.close()r.read。问题是当你写它时通常是bufferes文本而不是将它保存在文件中。所以r.read文件中没有任何内容。

答案 1 :(得分:6)

此代码:

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    {
        ofstream w( "foo.txt" );
        int ints[10] = {0,1,2,3,4,5,6,8,9};
        w.write((char*)&ints, sizeof(ints));
    }
    {
        ifstream r( "foo.txt" );
        int in_ints[10];
        r.read((char*)&in_ints, sizeof(in_ints));
        for( int i = 0; i < 10; i++) {
            cout << in_ints[i] << " ";
        }
    }
}

打印:

0 1 2 3 4 5 6 8 9 0

请注意,初始化中缺少一些数字。

答案 2 :(得分:1)

写入文件的数据不一定对其他流可见(in 文件关闭或至少刷新之前的相同过程。 如果在启动程序之前文件"foo.bin"不存在, 打开它进行阅读将失败(所以进一步使用将是一个 无操作)。您的程序违反了最基本的规则之一 编程:如果有任何事情可能失败,请始终检查它是否有过 持续。您不会检查IO的任何结果。

我可能还会补充说,以这种方式读取和写入数据非常非常 脆弱的,一般只能保证在同一个工作 进程 - 甚至使用不同版本的编译器重新编译 或者不同的编译器选项可能导致数据表示 改变,结果是你将无法读取所写的数据 早。在int数组的情况下,当然,这是非常高的 只要你不改变机器架构就不太可能。但在 一般来说,如果您将来需要重读数据,那就是了 技术最好避免。 ((char*)reinterpret_cast,而且是reinterpret_cast 我们知道,{{1}}是一个非常强烈的信号,有一个 可移植性问题。)