将 short int 保存在二进制文件而不是文本文件中

Save short int in binary file instead of text file

假设我有一个包含 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;
}

第一个建议,如果您想使用大小有保证的类型,请使用 header 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