我正在用fstream
将四个int(a=1,b=2,c=3,d=4(写入c++中的二进制文件,但当我试图读回它们时,它们不匹配。
首先,写入的二进制文件有4个字节长。它不应该是16个字节吗?当我读取时,如果我不初始化读取函数中的变量为零,我会得到奇怪的结果1234 2 3 4
,如果我初始化了,则会得到1234 0 0 0
。
此外,零初始化是如何修改结果的?我知道不初始化可能会导致糟糕的结果,但read((中的变量究竟是如何获得与write((相匹配的值的?
#include <fstream>
#include <iostream>
void write()
{
std::ofstream output( "test.bin", std::fstream::binary | std::fstream::out);
int a=1, b=2, c=3, d=4;
output << a << b << c << d;
output.close();
}
void read()
{
std::ifstream input( "test.bin", std::fstream::binary | std::fstream::in);
int a, b, c, d;
// int a=0, b=0, c=0, d=0;
input >> a >> b >> c >> d;
input.close();
std::cout << a << " " << b << " " << c << " " << d << " " << std::endl;
}
int main()
{
write();
read(); // Shows 1234 2 3 4 or 1234 0 0 0
}
output << a << b << c << d;
正在使用operator<<
流插入运算符,该运算符用于格式的输出。所有四个整数都被格式化为字符串,并且输出时它们之间没有分隔符。
您可以通过实际查看自己的文件来轻松地看到这一点(如果您希望文件包含不可打印的二进制值,请使用hexdump
或类似文件(。它包含字符串1234
,不是吗?
您想要未格式化的输出,这意味着您不希望流将整数格式化为字符串。这是通过调用write
(以及read
而不是operator>>
(来实现的。
输出:
output.write(reinterpret_cast<char *>(&a), sizeof(a));
output.write(reinterpret_cast<char *>(&b), sizeof(b));
// etc.
输入:
input.read(reinterpret_cast<char *>(&a), sizeof(a));
您可能期望std::fstream::binary
开放模式阻止流插入将整数格式化为字符串,但这是不正确的:二进制模式只控制换行行为。<<
和>>
运算符始终用于格式化I/O。