如何在 C++ 中更改文件内容

how can I change a file content in c++?

本文关键字:文件 C++      更新时间:2023-10-16

我有这个程序,可以将文件中的负数更改为正数。它有效,但文件中的负数不会更改。例如,如果我的文件中有这个数字:12 2 -3 -1当我运行该程序时,数字的总和将是 18,但是当我再次打开文件时,我看到 12 2 -3 -1 .我应该怎么做才能看到 12 2 3 1 ?这是我的代码:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
string name;
cin >> name;
int number; 
int num=0;

ifstream myFile(name, ios::in);
ofstream mine(name, ios::app);
while(myFile >> number)
{
    num += (number<0 ? -number : number);
    mine << num;
}

cout << "num = " << num << endl;

    system("pause");
return 0;
}  
  1. 同时打开文件进行读取和写入通常不是一个坏主意。您可能在打开mine时遇到I/O错误,但由于您没有检查它,程序会静默忽略您的写入。尝试先读取文件内容(例如向量(,然后关闭文件进行读取并再次打开进行写入(不追加,因为这会将旧内容保留在文件中(。
  2. 将值写回文件时,也要在数字后写空格,否则你只会在文件中得到一串数字,但你不知道一个数字在哪里开始,另一个在哪里结束。
  3. 您的程序现在不会"将负数更改为正数",而是将绝对值的累积总和打印到文件中。
  4. 首先尝试写入标准输出,这样在测试时就不会破坏文件。如果有效,请将cout更改为输出流。

这是代码。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;
int main()
{
string name;
cin >> name;
int number;
int num=0;

ifstream myFile(name, ios::in);
vector<int> vec;
while(myFile >> number)
{
    vec.push_back(abs(number));
}
ofstream mine(name, ios::out);
for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
    num += *it;
    mine << *it << " ";
}
cout << "num = " << num << endl;

return 0;
}
  • 同时打开同一文件和进程的读取和写入文件流会导致文件损坏。使用 ostringstream 存储从文件中读取的值。价值观从文件中读取,并将值存储在 Ostringstream 中缓冲区。ifstream对象在重新打开文件之前关闭一个ofstream对象,以便可以保存缓冲区内容。

  • 注意:ios::app标志已被删除。否则新值将追加到现有值。

  • abs()函数用于写回绝对值 - 这强制所有值为正。

    #include<sstream>
    int main()
    {
        string name;
        cin >> name;
        int number;
        int num=0;
        ifstream myfile(name.c_str(), ios::in);
        ostringstream oss;
        while (myfile >> number)
        { 
           num += (number<0 ? -number : number);
           oss << abs(number) << " ";
        }
        myfile.close();
        ofstream mine(name.c_str());
        cout << "num = " << num << endl;
        mine << oss.str();
        return 0;
    

    }

string name;
cin >> name;
int number=0; 
int sum=0;
string outname=name+".pos.txt";
ifstream myFile(name,ifstream::in);
ofstream mine(outname, ofstream::out );
while(myFile >> number)
{
    number= (number<0 ? -number : number);
    sum+=number;
    mine << number<<' ';
}
myFile.close();
mine.close();
cout << "sum = " << sum << endl;

    system("pause");