【问题标题】:Binary file size bigger than expected c++二进制文件大小比预期的c ++大
【发布时间】:2017-03-24 13:44:07
【问题描述】:

此代码创建大小为 2338 字节的文件

ofstream ofs("out", ios::binary);
ofs << htonl(1);
int size = sizeof(htonl(1));
for(int i = 0; i < 500; i++){
    ofs << htons((unsigned short)(sin(i/5)*1000));
    size += sizeof(htons((unsigned short)(sin(i/5)*1000)));
}
cout << "file size : " << size << endl;
ofs.close();

但输出是“文件大小:1004”,为什么文件大小实际上不是 1004 字节?

【问题讨论】:

  • 查看sizeof 的作用。提示:它不会给你打印时的字节数。
  • i/5 是这里的整数除法吗?
  • @Borgleader 我已经解决了这个问题,但感谢您的观察
  • @nwp 我认为在二进制模式下它会打印字节,而不是数字的字符表示

标签: c++ file


【解决方案1】:

如果您在文本编辑器中打开文件,您会很快发现问题所在。

这些数字以十进制表示形式打印,而不是作为其内部(二进制)表示形式。

改为使用ostream::write:

uint32_t foo = htonl(1);
ofs.write(reinterpret_cast<char*>(&foo), sizeof(foo));

【讨论】:

    【解决方案2】:

    但输出是“文件大小:1004”,为什么文件大小实际上不是 1004 字节?

    因为std::ostream::operator&lt;&lt;() 以文本格式输出数字,例如数字 1 占用 1 个字节,数字 1000 占用 4 个等等。sizeof() 以字节为单位提供数据类型的大小。这些是不相关的数字,您不能期望它们匹配。

    如果您想写入二进制数据,请使用std::ostream::write() - 这样您的数字就会匹配(但您无法通过文本编辑器读取该文件)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 2012-04-13
      • 2014-03-30
      • 2012-12-04
      • 2022-10-13
      • 1970-01-01
      相关资源
      最近更新 更多