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

Cannot read simple binary integers from file? (C++)

本文关键字:整数 二进制 C++ 简单 文件 读取      更新时间:2023-10-16

我的代码如下:

更新

#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位)将显示正确的序列,包括十六进制转储。

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

你明白为什么我的阅读方法失败了吗,而它实际上与我的写作方法相反?

r.read之前尝试w.flush()w.close()。问题是,当您编写它时,通常会对文本进行缓冲,而不将其保存在文件中。所以CCD_ 4的文件中没有任何实际内容。

此代码:

#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

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

写入文件的数据不一定对其他流可见(在是否相同的过程),直到文件被关闭或至少被刷新。如果在启动程序之前文件CCD_ 5不存在,打开它进行阅读将失败(因此所有进一步的使用都将是无操作)。您的程序违反了编程:如果任何东西都可能失败,请始终检查它以前是否失败继续。你没有检查你的IO的任何结果。

我还可以补充一点,以这种方式读取和写入数据是非常非常脆弱,通常只能保证在流程;甚至使用不同版本的编译器重新编译或者不同的编译器选项可能导致数据表示更改,结果是您将无法读取写入的数据早些时候。当然,在int阵列的情况下不太可能,只要你不改变机器架构。但在一般来说,如果将来需要重新读取数据最好避免这种技术。((char*)reinterpret_cast,作为我们知道,reinterpret_cast是一个非常强的信号,表明便携性问题。)