在 C++ 中写入整数并从二进制文件中读取它们:字节数 mismaych
Posted
技术标签:
【中文标题】在 C++ 中写入整数并从二进制文件中读取它们:字节数 mismaych【英文标题】:Write integers and read them back from binary file in C++: number of bytes mismaych 【发布时间】:2021-03-13 14:38:32 【问题描述】:我正在使用fstream
将四个整数(a=1、b=2、c=3、d=4)写入 C++ 中的二进制文件,但是当我尝试将它们读回时,它们不匹配.
首先,写入的二进制文件有 4 个字节长。不应该是 16 个字节(4 个整数 x 4 个字节/整数)吗?当我阅读时,如果我没有对读取函数中的变量进行零初始化,我会得到奇怪的结果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
【问题讨论】:
operator<<(..., int)
是一个 FormattedOutputFunction。它将整数格式化为字符串,它们之间没有分隔。当您回读它时,连接的数字字符串看起来与单个整数 (1234) 没有区别。您可以通过查看您自己的文件轻松确认这一点。如果您希望它是不可打印的二进制文件,请使用 hexdump
或类似的安全文件。
您正在写入“1234”,然后将 1234 读入a
。 b
、c
、d
的值基本上是随机的,这就是零初始化改变它们的原因。
我的印象是,对于二进制读/写,您想使用流的.read
/.write
函数。
@Cedric since c++11 0
被分配以防提取失败。无论如何,没有什么是“随机的”
@largest_prime_is_463035818 是什么让你这么说?在赋值的情况下(即使在 C++11 和更高版本中),我想说什么都没有传递给变量,因为流在提取之前失败,这意味着它保留了它以前的值。在这个例子中,它们显然不是0
,因为值是1
、2
、3
。我假设它们只是碰巧落入与以前相同的记忆中,即随机的。
【参考方案1】:
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
开放模式可以防止流插入将您的整数格式化为字符串,但这是不正确的:binary mode 仅控制换行行为。 <<
和 >>
运算符始终用于格式化 I/O。
【讨论】:
以上是关于在 C++ 中写入整数并从二进制文件中读取它们:字节数 mismaych的主要内容,如果未能解决你的问题,请参考以下文章