【问题标题】:ostream::write - What happens when my streamsize is smaller than my charostream::write - 当我的流大小小于我的字符时会发生什么
【发布时间】:2015-01-15 15:44:37
【问题描述】:

我正在使用这个函数来写二进制文件:

ostream& write (const char* s, streamsize n);

我想知道当我的流大小 n 小于我的 s 时会发生什么。我的原始代码如下所示:

int new_number = 10;
out.write((char*) &new_number, sizeof (new_number));

你能预测一下当我把它改成:

int new_number = 10;
out.write((char*) &new_number, 2);

是否有可能节省磁盘空间的方法? 抱歉,我忘了说我要存储一个 24 位整数。

【问题讨论】:

  • “有没有可能节省磁盘空间的方法?”不!如果您想节省磁盘空间,请使用不同的数字类型,例如short.
  • 它将写入new_number的二进制表示的两个低位字节。由于二进制表示是实现定义的,从技术上讲,结果是不可预测的。在典型的小端二进制补码机器上,它相当于int16_t temp = static_cast<int16_t>(new_number); out.write((char*) &temp, sizeof(temp));
  • 对不起,我忘了说我要存储一个 24 位整数。但是这个没有数据类型
  • 类似这样的事情:uint32_t number = whatever(); unit8_t temp[3] = {static_cast<unit8_t>(number), static_cast<unit8_t>(number>>8), static_cast<unit8_t>(number>>16)}; out.write((char*)temp, sizeof(temp));
  • @Birdperson "我想存储一个 24 位整数"uint32_t 就可以了。

标签: c++ file binary ostream


【解决方案1】:

这将写入int 表示的前两个字节。这在某些情况下可以工作,但不可移植:

  • 如果机器的字节顺序不是little-endian,那么你将失去价值;
  • 如果值太大而不能用两个字节表示,那么你会得到错误的值;
  • 如果该值可能是负数,那么您需要小心读取它的方式;
  • 如果int 小于两个字节,则不会节省空间。

转换为固定大小的类型会更安全,例如int16_t,必要时检查范围。

【讨论】:

    猜你喜欢
    • 2016-01-26
    • 1970-01-01
    • 2020-11-13
    • 2022-01-21
    • 2014-03-04
    • 2015-01-18
    • 2017-08-28
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多