如何用总和替换文件中的数字?

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,它既可以读又写,我可以不用再次打开它……你知道为什么它不能那样工作吗?

以上是关于如何用总和替换文件中的数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何用js中的单个字符替换单个数字和两位数字? [复制]

如何用 0 替换 varchar 列中的所有非数字值

如何用给定的数字替换模式中的x?

如何用(data.frame)查找表中的值标签替换数据框中的数字代码?

如何用相同长度的唯一数字替换特定长度的字符

如何用Powershell中的字符替换初始字符+空格