4

既存のファイルの45バイト目の前に文字列を追加する必要があります。fseek以下のように使ってみました。

int main()
{
    FILE *fp;
    char str[] = "test";     

    fp = fopen(FILEPATH,"a");
    fseek(fp,-45, SEEK_END);                
    fprintf(fp,"%s",str);
    fclose(fp);     
    return(0);
}

このコードは、EOFから45番目の文字の前に「test」を追加することを期待していました。代わりに、EOFに「test」を追加するだけです。

解決策を見つけるのを手伝ってください。

これは私の前の質問の続きです
cの最後の行の前にファイルにアイテムを追加します

4

3 に答える 3

11

モード r+ (既に存在する場合) または a+ (存在せず、作成したい場合) で開きます。ファイルの終わりの前に 45 バイトを探しているので、既に存在すると想定しています。

fp = fopen(FILEPATH,"r+");

コードの残りの部分は問題ありません。また、これはテキストを挿入するのではなく、現在ファイル内のその位置にあるものを上書きすることに注意してください。

つまり、ファイルが次のようになっている場合:

xxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxx

このコードを実行すると、次のようになります。

xxxxxxxtestxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxx

本当に挿入して上書きしたくない場合は、SEEK_END-45 から EOF までのすべてのテキストをメモリに読み込み、testを書き込んでから、テキストを書き戻す必要があります。

于 2010-07-16T11:54:26.657 に答える
3

a任意の位置に書き込む場合は、append()として開かないでください。すべての書き込みをファイルの最後に強制します。r+どこでも読み書きに使用できます。

于 2010-07-16T11:50:40.520 に答える
0

プラットフォーム固有の構成を回避するには、常に fopen() 呼び出しでバイナリ モードまたはテキスト モードを明示的に示します。

ある日コードを移植すれば、何時間もの絶望的な時間を節約できます。

于 2010-07-16T12:12:29.580 に答える