【问题标题】:Save short int in binary file instead of text file [duplicate]将短整数保存在二进制文件而不是文本文件中[重复]
【发布时间】:2016-12-11 16:35:55
【问题描述】:

假设我有一个包含 9 个整数的向量。

总共应该有 36 个字节。

其中一些整数适合short 的大小,所以我想将适合short 的整数存储在2 个字节中,将不适合的整数存储在4 个字节中。

我注意到带有120 98 99 99 98 257 259 98 0 的文件有 28 个字节,我想知道我做错了什么。

ofstream out(file, ios::binary);
int len = idx.size();                    //idx is the vector<int>
string end = " 0", space = " ";          //end is just to finish the saving.
for(int i = 0; i < len; i++) {
    if(idx[i] <= SHRT_MAX){
        short half = idx[i];
        out<<half;
    }
    else out<<idx[i];
    if(i == len-1) out<<end; else out<<space;
}

【问题讨论】:

  • strlen("120 98 99 99 98 257 259 98 0") 是 28。
  • 有些相关:int保证为 4 个字节,short保证为 2 个字节。大多数编译器都使用这些大小,但标准并未强制执行。
  • 您以后打算如何阅读该文件?我的意思是,你如何决定读什么 - int 或 short?
  • binary 打开文件并不意味着输出将是二进制的。这只是意味着不会触及行尾。这必须是重复的。
  • @Daniel 将逻辑更改为什么?我在暗示的是,以这种方式存储的数据是不可能恢复的

标签: c++ save short


【解决方案1】:

第一条建议,如果您想使用有保证大小的类型,请使用标头 cstdint。 uint16_t 等类型是标准的,存在是有原因的。

接下来,这个想法有时写两个字节,有时写四个。请记住,当您将数据写入这样的文件时,它看起来就像一大块数据。没有任何方法可以神奇地知道何时读取两个字节以及何时读取四个字节。您可以存储有关文件的元数据,但这可能比简单地始终使用相同的大小更低效。将所有内容写入两个字节或四个字节。这取决于你,但无论是什么,你都应该坚持下去。

现在,继续讨论为什么要写入 28 个字节的数据。

您正在编写数字的 ASCII 表示形式。这最终是 "120 98 99 99 98 257 259 98 9",大小为 28 字节。

在编写数据时,您可能想要执行类似的操作

out.write( (char*)&my_data, sizeof(my_data));

请记住,尽管这并不是一种真正安全的二进制数据写入方式。我想你已经明白了确保你写出你想要的大小的必要性。可悲的是,创建可移植文件的复杂性并没有就此结束。您还需要担心运行程序的机器的字节序。这是一篇我认为您可能会喜欢阅读以了解有关该主题的文章的文章。

Disch's Tutorial To Good Binary Files

【讨论】:

  • out.write( (char*)&amp;my_data, sizeof(my_data)); 如何应用于 vector ?我的意思是,我不明白这个转换为 char*
  • 这适用于编写单个整数类型。无论如何,您已经在向量中的每个元素一次写入一个。
  • 您转换为 char 的原因是因为 'write' 不理解其他类型。它只关心得到一个看起来像字节数组的东西。
  • 所以你建议不要使用向量,一旦我将元素 x 添加到向量中,我会写 out.write( (char*) &amp;x, sizeof(x)) ?
  • 不,我只是告诉您以不同的方式编写元素。您如何将数据存储在内存中有点无关紧要。
猜你喜欢
  • 1970-01-01
  • 2018-04-28
  • 2015-05-17
  • 2016-07-12
  • 2016-02-21
  • 1970-01-01
  • 2010-11-21
  • 2020-06-24
  • 2017-09-17
相关资源
最近更新 更多