0

ファイルの内容を完全に変更するより高速な方法を探しています。例の後、それは明らかです:

a.txt :

私は非常に長い (おそらく長すぎない) ファイルです。もっと長くなれると確信しています。

プログラムを実行した後、ユーザーの入力に従って、たとえば次のようになります。

ユーザー入力:

やあ!

それから私は使用しようとしましたfwrite。問題は、ファイルの残りの部分がまだ残っていることです。そのため、次のようなものがあります。

a.txt :

こんにちは、非常に長い (長すぎないかもしれません) ファイルです。もっと長くなれると確信している

いくつかの調査の後、これは私がやったことです:

FILE
    *a;

char
    buffer[500];

a = fopen("a.txt", "r");
    fread(buffer, sizeof(char), 500, a);

    printf("%s\n", buffer);

a = freopen("a.txt", "w", a);

    scanf("%s", buffer);

            // rewind(a);
            // fwrite(buffer, sizeof(char), strlen(buffer), a);

    fwrite(buffer, sizeof(char), 10, a);
    fclose(a);

それは機能しますが、それを行うより良い方法があるかどうか知りたいです。

4

3 に答える 3

0

ポータブル C を使用してこれを行うより良い方法を知りません。

実装には小さな問題がいくつかあります。

発生した可能性のあるエラーをチェックしません。これは現実の世界では重要です。特にエラーでfreopen戻る可能性がNULLあり、それを元のポインターに割り当てるとfclose、ファイルへの機能が失われます。

freadまた、通常の C 文字列は 0 バイトで終わりますが、生のバイトを読み取るため、そのゼロ バイト用のスペースを予約して提供する必要が あることも覚えておく必要があります。scanfゼロ バイトを書き込むので、10 をハードコーディングする代わりに、書き込むstrlenバイト数を決定するために使用できます。fwrite

最後にscanf、モックを作成するのは簡単ですが、現在の方法では、ユーザーが 499 バイトを超える値を提供すると、バッファ オーバーフローが発生し、非常に悪い結果が生じる可能性があります。

于 2013-01-23T01:15:19.600 に答える
0

ファイルを切り捨てるには、ftruncate()POSIX関数を使用するだけです。fwrite()

于 2013-01-23T00:51:41.623 に答える
0

「w」フラグはファイルを作成し、存在する場合は既存のコンテンツを切り捨てます。それが必要です。

以前に使用したことはありませんfreopen()が、それが問題に関連していると思われます。で入力ファイルを単純に閉じてから、 ?fclose()を使用してファイルを再度開きます。fopen()

于 2013-01-23T00:48:32.763 に答える