0

我有这个程序可以在我的文件中将负数更改为正数。它可以工作,但文件中的负数不会改变。例如,如果我的文件中有这个数字: 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;
}  
4

3 回答 3

1
  1. 同时打开文件进行读写通常不是一个坏主意。您可能在打开过程中遇到 I/O 错误mine,但由于您没有检查它,程序会默默地忽略您的写入。尝试先读取文件内容(例如读取到矢量),然后关闭文件进行读取并再次打开以进行写入(不附加,因为这会将旧内容留在文件中)。
  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;
}
于 2013-06-22T07:18:42.223 回答
1
  • 同时打开同一文件和进程的读取和写入文件流会导致文件损坏。使用 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;
    

    }

于 2013-06-22T07:24:07.770 回答
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"); 
于 2013-06-22T07:22:55.390 回答