【问题标题】:What is causing 0 and 1 to be written to the end of the new file? C++是什么导致 0 和 1 被写入新文件的末尾? C++
【发布时间】:2021-07-13 18:51:10
【问题描述】:

我在工作中使用两个不同的 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 的版本。

抱歉,如果这不够清楚,我第一次撞到了墙,我在论坛上发帖大声笑。感谢您的帮助,我是自学成才,并且喜欢与我一起工作以了解我可以/应该改进的地方。

【问题讨论】:

  • 如果您创建了minimal reproducible example,则可以在几秒钟内回复,这将帮助您更快。
  • 因为提问者只是为了让事情顺利进行,一个易于理解且因果关系明确的示例将更有效地帮助未来的提问者。
  • 要将一个文件的上下文复制到另一个文件中,请使用backup &lt;&lt; today.rdbuf();rdbuf() 返回指向流输入缓冲区的指针;输出流有一个重载的插入器 (operator&lt;&lt;) 将缓冲区复制到流中。
  • 另外,您不必在函数结束时调用stream.close();。流的析构函数会这样做。

标签: c++ getline


【解决方案1】:

我认为问题在于:

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

...您正在尝试将流callbackrecapNEW 的内容输出到recapNEW,但它不起作用。而是输出文件流的布尔“良好”状态。预先添加到流中并不是那么简单。

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

【讨论】:

  • 试过没有那条线,效果很好。对此感激不尽!我什至没有认为 1 和 0 是布尔值的明显标志,哈哈。
猜你喜欢
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
相关资源
最近更新 更多