ofstream<<运营商没有为文件

时间:2017-01-17 21:44:34

标签: c++ file io fstream

在谈到这一点时,我对文件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;运算符因许多不同的类型而重载,所以我认为这会写出正确的数据类型。我猜不会。

感谢。

2 个答案:

答案 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();