【问题标题】:C++ Last Number is only 2bytes instead of 4 when writing integer to fstream将整数写入 fstream 时,C++ Last Number 仅为 2 字节而不是 4
【发布时间】:2014-06-18 16:06:51
【问题描述】:

我尝试使用 ostream 将 32 位整数写入文件。我正在使用

ostream file;
map<unsigned char, int32_t> histogram;
//… 
file << reinterpret_cast<char*>(&histogram[i]);  

除了最后一个数字(在我的例子中是 11328,它是二进制的 40 2C 00 00)之外,它运行良好,但只有 40 2C 被写入文件。

这是同一个数字,但是当我要再次导入文件时,我想假设每个数字都以 32 位编码。

我做错了什么?

【问题讨论】:

  • 多一点代码、示例输入、预期输出和示例输出将有助于诊断问题。
  • 你很幸运,这一切都奏效了。
  • 所以你想写一个二进制文件,不是吗?然后转换为指针是错误的方法。

标签: c++ byte fstream ostream


【解决方案1】:

您正在将operator&lt;&lt;(ostream&amp;, const char *) 重载用于明显不是 C 风格的以空字符结尾的字符串,这会导致未定义的行为。1

对于40 2C 00 00,函数将零字节解释为空终止符,因此它只打印前两个字节。

如果您需要二进制 I/O,请使用 ostream::write()&lt;&lt; 用于格式化 I/O。


1) 更准确地说,只要整数的最后一个字节不为零,您就处于未定义行为领域 - 即,只要打印出您要打印的所有 4 个字节.

【讨论】:

  • 使用ostream::write(),他必须自己格式化数据。需要char const*,而不是void const* 是有原因的;如果您需要reinterpret_cast,那么您正在做一些不可移植的事情。
【解决方案2】:

当你使用file &lt;&lt; reinterpret_cast&lt;char*&gt;(&amp;histogram[i]);时,其实它认为你想输出一个C风格的字符串。所以遇到'\0'时它会停止输出。所以你的结果是 40 2C。

你可以试试 stdio.h 中的fwrite() 函数。

【讨论】:

  • 对不起。我推荐 fwrite() 因为我不熟悉 ostream 类。但我想知道为什么 fwrite() 不是 C 的好推荐?谢谢。@JamesKanze
猜你喜欢
  • 2010-11-22
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 2014-12-18
  • 2021-06-17
  • 1970-01-01
相关资源
最近更新 更多