【发布时间】: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 << today.rdbuf();。rdbuf()返回指向流输入缓冲区的指针;输出流有一个重载的插入器 (operator<<) 将缓冲区复制到流中。 -
另外,您不必在函数结束时调用
stream.close();。流的析构函数会这样做。