用C++编写整数并从二进制文件中读回:字节数错误



我正在用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。

最新更新