2

longc++ fstream クラスを使用して、テキスト ファイルに aを書き込もうとしています。ファイルは実行前にすでにディスク上に作成されています。次のコードを実行すると、初期値を読み取ることができますが、新しい値を保存できず、上書きされます。私は何を間違っていますか?

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>


using namespace std;

int main(int argc, char* argv[]) {

    long f;

    fstream myFile("data.txt", fstream::in|fstream::out);
    cout << "f before: " << f << endl;
    myFile >> f;
    cout << "f after: " << f << endl;
    f++;
    cout << "f after increment: " << f << endl;

    myFile << f;
    myFile.close();

    return 0;
}

その後、ファイルの値を読み取りましたが、変更されていません。ここで何が間違っていましたか?

4

4 に答える 4

2

書き込む前に、ファイルの先頭に巻き戻す必要があります。それ以外の場合、2 番目の値は最初の値の後に書き込まれます。

于 2012-12-14T12:30:15.250 に答える
1

カウントを正しく更新するには、 myFile.seekp(ios::beg);直前に追加する必要があります。myFile << f;

最後に追加し続けたい場合は、myFile.clear();前に追加しmyFile << f;ます。これにより、コンテンツは次のようになります: 1-> 12-> 1213-> 12131214-> 1213121412131215. 入力の読み取り時に eof に到達するため、これが必要です。get ポインターと put ポインターは同じであることに注意してください。

あなた自身が正しく指摘しているように、ファイルには改行ではなく数字だけがあるため、これが必要です。したがって、読み取り操作は EOF に直接ヒットし、問題を引き起こします。これを回避するには、eof ステータスをクリアして続行します。

あなたが提案したように、最後に改行を追加することが解決策です。その場合

myFile.seekp(ios::beg);
myFile << f<<"\n";

完全な解決策になります。

于 2012-12-14T12:32:58.060 に答える
0

私はここで間違っていたことを理解しました:

私のファイルには、後で読み書きしたい long のみが含まれていました。ファイルを読み取ったときに EOF に達し、最後に巻き戻しや書き込みができませんでした。

つまり、私の解決策は、ファイルの末尾にスペースまたは \n を含めることでした。

APIがこのように機能する理由を知っている人はいますか? 私にはあまり役に立たないようです...

于 2012-12-14T16:23:44.117 に答える
-1

これは、次の行と関係があります。

myFile >> f;

それを削除すると、すべてが正常に機能します。私は fstream に精通していませんが、このコードは長い文字列を強制しようとするようです。また、これを long にキャストすることも許可されていないため、このように実行することは決して意図されていないと思います。ファイルから値を long 型として取得する方法を読んでから、もう一度やり直すことをお勧めします。

編集:この
サイト を少し読んだ後、読み取りと書き込みの間にファイルを閉じて再度開く必要があることが示唆されましたが、実際に修正されたことに驚きました。なぜだろうと思わずにはいられませんが、 fstream は読み取りまたは書き込み、またはその両方を目的としていると思っていました.... とにかく、ここにあなたの作業コードがあります:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char* argv[]) {

    long f;

    fstream myFile("data.txt", fstream::in|fstream::out);
    cout << "f before: " << f << endl;
    myFile >> f;
    cout << "f after: " << f << endl;
    f++;
    cout << "f after increment: " << f << endl;
    myFile.close();
    myFile.open("data.txt", fstream::in|fstream::out);

    myFile << f;
    myFile.close();

    return 0;
}
于 2012-12-14T12:50:09.367 に答える