让我们说我有一个9个整数的向量。
总计,我应该有36个字节。
这些整数中的一些整数与短的大小相符,所以我想存储那些适合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;
}
答案 0 :(得分:2)
第一条建议,如果要使用保证大小的类型,请使用标头cstdint。诸如uint16_t
之类的类型是标准的,并且是有原因的。
接下来,这个想法有时写两个字节,有时写四个。请记住,当您将数据写入此类文件时,它只会看起来像一大块数据。没有任何方法可以神奇地知道何时读取两个字节以及何时读取四个字节。您可以存储有关该文件的元数据,但这可能比仅仅始终使用相同的大小更低效。将所有内容写为两个字节或四个字节。这取决于你,但无论如何,你应该坚持下去。
现在,继续讨论为什么要写入28个字节的数据。
您正在编写数字的ASCII表示形式。最终为"120 98 99 99 98 257 259 98 9"
,其大小为28字节。
在编写数据时,您可能希望执行类似
的操作out.write( (char*)&my_data, sizeof(my_data));
请记住,尽管这不是一种编写二进制数据的安全方法。我想你已经明白了确保你写出你想要的尺寸的必要性。可悲的是,创建便携式文件的复杂性并没有结束。您还需要担心程序运行的机器的endianess。这篇文章我认为您可能会喜欢阅读以了解有关该主题的更多信息。