【问题标题】:Problems writing an integer to binary file C++将整数写入二进制文件 C++ 的问题
【发布时间】:2016-01-05 12:45:42
【问题描述】:

我正在使用 fstream 将整数写入二进制文件。

int main(){

fstream f1;
int num = 2, num2 = 0;

f1.open("dat1", ios::app | ios::out | ios::in | ios::binary);

f1.write((char *)num, sizeof(int));
f1.seekp(0);
f1.read((char *)num2, sizeof(int));

cout << num2;

}

问题出在 f1.write 行。我可以向二进制文件写入一个数组,但是当我尝试只写入一个 int 块时,它给了我一个错误:

Project.exe 中 0x522C7EA6 (msvcp120d.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000002。

我不明白问题出在哪里。

【问题讨论】:

    标签: c++ file binary fstream


    【解决方案1】:

    您需要将num地址 转换为char*,而不是num 本身。实际上,使用(char*)num 的结果的行为是undefined,这解释了崩溃。

    请改用f1.write((char *)&amp;num, sizeof(num));。类似地更改f1.read

    我还更改了 sizeof 参数:我更喜欢这种风格,因为它可以让您在未来避免类型更改。继续前进,如果您在不同平台(例如 Windows 和 Linux)上编写和阅读,则需要考虑 endianness

    【讨论】:

      【解决方案2】:

      你需要这个:

      f1.write((char *)&num, sizeof(int));
      f1.seekp(0);
      f1.read((char *)&num2, sizeof(int));
      

      write()read() 想要一个指向您的数据所在位置的指针。

      int num = 2;
      

      使用(char *)numnum 转换为指向地址0x00000002 的指针。


      此外,在处理二进制文件(测试除外)时,最好始终包含一个标头,该标头至少应包含以下内容:

      • Magic Number(通常为 4 个字节),因此无论扩展名是什么,都可以确定或检查确切的文件类型。

      • 一个版本号,它将允许您在将来扩展文件的格式和结构而不会破坏您当前的格式。

      • 正如其他人已经说过的,Byte Order Mark 将允许您的数据在所有平台(小端/大端)上正确读取。

      【讨论】:

        【解决方案3】:

        该行实际上应该是:

        f1.write((char *)&num, sizeof(int));
        

        您需要一个地址作为write 函数的参数。 查看http://www.cplusplus.com/reference/ostream/ostream/write/

        【讨论】:

        • 如果需要,还需要考虑字节序,以便以独立于平台的方式使用文件。
        【解决方案4】:

        write 想要一个数组。这意味着起始地址。 (char *)num 这会将数字转换为地址,并将指向您不想要的点。使用&amp;num 获取num 的地址。也许也可以使用(char*) 进行演员表。

        【讨论】:

          猜你喜欢
          • 2012-03-03
          • 2010-10-20
          • 1970-01-01
          • 2015-01-30
          • 1970-01-01
          • 1970-01-01
          • 2017-01-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多