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
  • 同じファイルとプロセスの読み取りおよび書き込みファイル ストリームを同時に開くと、ファイルが破損する可能性があります。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 に答える
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 に答える