如何用总和替换文件中的数字?
Posted
技术标签:
【中文标题】如何用总和替换文件中的数字?【英文标题】:How to replace a number in a file with its sum? 【发布时间】:2022-01-12 12:05:28 【问题描述】:我想编写一个程序,它在文件中获取一个整数,将其与输入数字相加,并用总和的结果替换文件中的前一个整数。我认为下面的代码可以工作,但是文件中写入的 0 仍然是 0,无论我输入的整数是什么。我做错了什么?
#include <iostream>
#include <fstream>
using namespace std;
int main()
fstream arq;
arq.open("file.txt");
int points, total_points;
cin >> points;
arq >> total_points;
total_points += points;
arq << total_points;
【问题讨论】:
您是否尝试过关闭文件,然后以独占方式以写入模式重新打开? @SamVarshavchik 现在我做到了,而且成功了。谢谢你。但是我没有关闭它,我只是直接重新打开它,因为我读过你不需要关闭if/of/fstream。这是一个错误的解决方案吗? @Jonas 该解决方案可能会导致令人困惑的结果,就像我在答案末尾提到的那样。它实际上与我在我制作的代码示例中所做的非常接近(除了我没有重新打开文件,而是倒带)。 @TedLyngmo 非常感谢,现在我明白了。 (另外,我接受了答案,实际上我不知道那是一回事)。 @Jonas 不客气,太好了!这应该会让一些人高兴:-) 【参考方案1】:由于您已打开文件进行读取和写入,因此您需要在将新值写入文件之前将输出位置指示器设置为位置 0。
例子:
#include <cerrno>
#include <fstream>
#include <iostream>
int main()
const char* filename = "file.txt";
if(std::fstream arq(filename); arq)
if(int total_points; arq >> total_points)
if(int points; std::cin >> points)
total_points += points;
// rewind the output position pointer to the start of the file
arq.seekp(0);
arq << total_points;
else
std::perror(filename);
请注意,如果您想将 较短的 值写入文件,您最终可能会得到如下所示的文件:
之前:
123456
将45
写入文件后:
453456
所以,我推荐Anoop Rana's answer 中的方法,它会在写入文件之前截断文件。
【讨论】:
【参考方案2】:您可以尝试分别读写输入文件,如下图:
#include <iostream>
#include <fstream>
using namespace std;
int main()
ifstream arq("file.txt");
int points=0, total_points=0;
cin >> points;
arq >> total_points;
total_points += points;
arq.close();
ofstream output("file.txt");
output << total_points;
output.close();
以上程序的输出可见here。
【讨论】:
这也有效,谢谢。我想既然我用了fstream,它既可以读又写,我可以不用再次打开它……你知道为什么它不能那样工作吗?以上是关于如何用总和替换文件中的数字?的主要内容,如果未能解决你的问题,请参考以下文章