C++;二进制文件I/O,写入时数据丢失 我用C++编写的《C++编程原理与实践》正在学习C++。我目前正在学习第11章,我发现了一个关于如何读取和写入整数二进制文件的示例(第11.3.2节)。我仔细研究了这个示例,使用了一个.txt文件(input.txt)和一个句子,我读写到另一个文件(output.txt)(text_to_binary fnc),然后读写回原始文件(input.txt)(binary_to_text fnc)

C++;二进制文件I/O,写入时数据丢失 我用C++编写的《C++编程原理与实践》正在学习C++。我目前正在学习第11章,我发现了一个关于如何读取和写入整数二进制文件的示例(第11.3.2节)。我仔细研究了这个示例,使用了一个.txt文件(input.txt)和一个句子,我读写到另一个文件(output.txt)(text_to_binary fnc),然后读写回原始文件(input.txt)(binary_to_text fnc),c++,char,integer,ifstream,ofstream,C++,Char,Integer,Ifstream,Ofstream,(二进制文本到文本fnc)返回结果: input.txt: 您好,这是一个了不起的测试。1234是一个数字,其他一切都不重要。 自闭症患者失踪 现在我的问题是,为什么会发生这种情况?是因为int保存为4字节吗 额外问题:出于兴趣,有没有更简单/更有效的方法 编辑:用结果更新了问题,以使其更加清晰当您尝试进行部分读取时,读取将尝试超出文件末尾,并且将为流设置eof标志。这将在循环条件false中使用它,因此循环结束 您需要检查循环后的流,以查看是否有任何字节实际读入变量x 但是请注意,部分读取只会

(二进制文本到文本fnc)返回结果:

input.txt:
您好,这是一个了不起的测试。1234是一个数字,其他一切都不重要。
自闭症患者失踪

现在我的问题是,为什么会发生这种情况?是因为int保存为4字节吗

额外问题:出于兴趣,有没有更简单/更有效的方法


编辑:用结果更新了问题,以使其更加清晰

当您尝试进行部分读取时,读取将尝试超出文件末尾,并且将为流设置
eof
标志。这将在循环条件
false
中使用它,因此循环结束

您需要检查循环后的流,以查看是否有任何字节实际读入变量
x


但是请注意,部分读取只会写入变量
x
的一部分,其余部分不确定。具体哪些部分取决于系统,使用带有不确定位的变量将导致未定义的行为。

该代码是否生成?它不可能正在使用。使用非标准的头文件,如您的
。/std_lib_facilities.h“
,无助于使您的代码更易于理解和维护。至于您的问题,
sizeof(char)
被指定为始终为
1
。这意味着您只能读取和写入(可能)四字节整数中的一个字节。看起来代码正在读取1字节的二进制整数,并将这些值作为十进制字符串写入,每行一个。@Someprogrammerdude是的,代码构建得很好。头文件包含名称空间std。让我更改post以使其更清楚。是的,我想我不能忍受,但是如果我在一些文本上使用sizeof(int)。某些文本丢失。非主题提示:关闭与在中创建流相同范围内的流,而不是在函数内。举个小例子来说,这没有什么区别,但对于大型项目来说,这可以使流程更加明显,有助于避免错误的假设。我更新了这篇文章,我想我还不够清楚,对此表示歉意。我想知道的是,当我使用sizeof(int)而不是sizeof(chars)时,为什么会丢失一些字母。我刚刚测试了你的建议,把x改成了字符。如果这样做,当我将output.txt转换回来时,我会丢失所有的空白。是的,我在这两个文件中都使用了sizeof(int)
#include<fstream>
#include<iostream>

using namespace std;

void text_to_binary(ifstream &ifs, ofstream &ofs)
{
    for (int x; ifs.read(as_bytes(x), sizeof(char));)
    {
        ofs << x << '\n';
    }
    ofs.close();
    ifs.close();
}

void binary_to_text(ifstream &ifs, ofstream &ofs)
{
    for (int x; ifs >> x;)
    {
        ofs.write(as_bytes(x), sizeof(char));
    }
    ifs.close();
    ofs.close();
}

int main()
{
    string iname = "./chapter_11/input.txt";
    string oname = "./chapter_11/output.txt";

    ifstream ifs{iname, ios_base::binary};
    ofstream ofs{oname, ios_base::binary};

    text_to_binary(ifs, ofs);

    ifstream ifs2{oname, ios_base::binary};
    ofstream ofs2{iname, ios_base::binary};

    binary_to_text(ifs2, ofs2);

    return 0;
}
1819043176
1752440943
1763734377
1851859059
1634558240
1735289210
1936028704
824192628
540291890
1629516649
1836412448
544367970
1919252069
1768453241
1696622446
543519596
1936027492
544483182
1953784173
774795877