在 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&lt;&lt;(..., int) 是一个 FormattedOutputFunction。它将整数格式化为字符串,它们之间没有分隔。当您回读它时,连接的数字字符串看起来与单个整数 (1234) 没有区别。您可以通过查看您自己的文件轻松确认这一点。如果您希望它是不可打印的二进制文件,请使用 hexdump 或类似的安全文件。 您正在写入“1234”,然后将 1234 读入abcd 的值基本上是随机的,这就是零初始化改变它们的原因。 我的印象是,对于二进制读/写,您想使用流的.read/.write 函数。 @Cedric since c++11 0 被分配以防提取失败。无论如何,没有什么是“随机的” @largest_prime_is_463035818 是什么让你这么说?在赋值的情况下(即使在 C++11 和更高版本中),我想说什么都没有传递给变量,因为流在​​提取之前失败,这意味着它保留了它以前的值。在这个例子中,它们显然不是0,因为值是123。我假设它们只是碰巧落入与以前相同的记忆中,即随机的。 【参考方案1】:
output << a << b << c << d;

正在使用operator&lt;&lt; 流插入运算符,用于格式化 输出。所有四个整数都被格式化为字符串,并且它们之间没有分隔符输出。

您可以通过实际查看自己的文件来轻松看到这一点(如果您希望文件包含不可打印的二进制值,请使用hexdump 或类似名称)。它包含字符串1234,不是吗?

您想要 未格式化 输出,这意味着您不希望流将整数格式化为字符串。这是通过调用write 来完成的(以及read 而不是operator&gt;&gt;)。

输出:

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 仅控制换行行为。 &lt;&lt;&gt;&gt; 运算符始终用于格式化 I/O。

【讨论】:

以上是关于在 C++ 中写入整数并从二进制文件中读取它们:字节数 mismaych的主要内容,如果未能解决你的问题,请参考以下文章

PHP如何将从二进制文件中读取的字节转换为数字

使用 c++ 时从二进制文件中读取 int 不正确

在 Swift 中从二进制文件中读取整数

C - 从二进制文件中读取位

尝试从二进制文件读取时引发违规

用 C 语言从二进制文件中读取位