在谈到这一点时,我对文件IO非常不确定,我真的很困惑。当我使用插入流操作符将一些短整数推入文件时,文件的大小不是我所期望的:
std::ofstream outFile("myFile.raw", std::ios::binary | std::ios::out);
std::vector<short> list;
for (int i = 0; i < 100; ++i) list.push_back(1);
for (auto i : list) outFile << i;
outFile.close();
这会创建一个100字节大的文件。我不理解,短路应该是两个字节。文档显示&lt;&lt;运算符因许多不同的类型而重载,所以我认为这会写出正确的数据类型。我猜不会。
感谢。
答案 0 :(得分:4)
您正在使用formatted output。
short int
被写为数字。每个数字为1
,这是单个字节的单个char
。
所以总数是100.如果你有short int
个包含两位数的数字,比如说22
,那么大小就是200.
作为替代方案,您可以使用unformatted output,也可以将数据转换为char
,这与您设置的binary
标志一起将写入数据而不进行格式化。在编写原始char
时要记住的一点是,您必须考虑文件中的字节数和how you want to order the bytes。
通常,格式化输出和输入可能更方便。作为使用原始char
编写文件的替代方法,最好查看serialization。
答案 1 :(得分:1)
原因是 - 如前面答案中的注释中所述 - 运算符<<
是格式化输出,并将值1
写为单个数字(仅包含一个字符)。< / p>
仅为了显示如何将short int写为二进制文件,请参阅以下代码:
std::ofstream outFile("myFile.raw", std::ios::binary | std::ios::out);
std::vector<short> list;
for (int i = 0; i < 100; ++i) list.push_back(1);
for (auto i : list) outFile.write((const char*)&i, sizeof(i));
outFile.close();
std::ifstream in("myFile.raw", std::ifstream::ate | std::ifstream::binary);
std::cout << "File size: " << in.tellg() << std::endl;
// prints out: File size: 200
in.close();