是什么导致 0 和 1 被写入新文件的末尾? C++

问题描述

我在工作中使用两个不同的 txt 文件来完成一项任务。其中一个会在我需要给某人回电时更新 (callback.txt),另一个会更新所有在一天结束时尚未完成的回调 (recap.txt)。我编写了一个基本的 Python 程序以及一个 PowerShell 脚本,它在一天结束时通过将前一天的最新条目添加到 recap.txt 的顶部来更新 recap.txt。

现在,我试图用 C++ 编写它只是为了获得一些该语言的经验,但我似乎无法找到我遇到这个问题的原因。一切都按预期工作,除了“recapNEW.txt”写入了 0 和 1 并且每个文件的末尾都在单独的行上。例如:

callback.txt:
  ----------
    here's something
    here is something else
    yadda yadda


recapOLD.txt
  ----------
    old news
    still need it though
    so we keep it around


recapNEW.txt (blank)
  ----------

并且,在运行程序之后:

recapNEW:
  ----------
    here's something
    here is something else
    yadda yadda
    old news
    still need it though
    so we keep it around
    0
    1

这是我写的:

#include<fstream>
#include<iostream>
#include<string>


void update () {

    std::ifstream callback("callback.txt");
    std::ifstream recapBAK("recapBAK.txt");
    std::ofstream recapNEW("recapNEW.txt");

    std::string callLine;
    std::string bakLine;

    if (!callback || !recapNEW || !recapBAK) {
        std::cerr << "Could not open needed files. Exiting.";
        std::exit(1);
        }

    while (std::getline ( callback,callLine )) {
        recapNEW << callLine << std::endl ;
        }

    while (std::getline ( recapBAK,bakLine )) {
    recapNEW << bakLine << std::endl ;
    }

    recapNEW <<  callback << std::endl << recapNEW << std::endl ;

    callback.close();
    recapBAK.close();
    recapNEW.close();
}

我将 recap.txt 文件拆分为两个单独的文件(“recapBAK.txt”和“recapNEW.txt”)以保留前一天回顾的副本,并在单独的函数中更新它(在下面发布),但是我已经缩小范围,就是上面的函数将额外的数字写入文件末尾。

void backup () {

    std::ofstream backup("recapBAK.txt");
    std::ifstream today("recapNEW.txt");

    std::string todayLine;

    while (std::getline (today,todayLine)) {
        backup << todayLine << std::endl;
    }

    backup.close();
    today.close();

}

最让我困惑的是,我没有看到我在第一个函数中做了什么不同的事情,导致整数被标记文件的末尾,因为没有额外的整数被添加到更新的recapUSED 版本。

如果这还不够清楚,请见谅,我第一次撞墙,以至于我在论坛上发帖大声笑。感谢您的帮助,我是自学的,喜欢与他人合作,看看我可以/应该改进的地方。

解决方法

我认为问题在于:

recapNEW <<  callback << std::endl << recapNEW << std::endl ;

...您正在尝试将流 callbackrecapNEW 的内容输出到 recapNEW,但它不能那样工作。而是输出文件流的布尔“良好”状态。准备一个流并不那么简单。

实际上,如果没有那条线,您似乎就拥有了所需的东西。您是否尝试将其删除?