2016-04-22 14 views
1

ファイルの最後ではなく、行単位で要素を追加したい。 私はこのコードを書いたが、結果はファイルの最後に要素を追加できるだけだった。各行の末尾にある要素をファイルに追加する

#include <stdio.h> 
#include <stdio.h> 

int main(void) 
{ 
    static const char filename[] = "m.txt"; 
    FILE *file = fopen(filename, "r+a"); 
    char *a = "ok"; 

    if (file != NULL) 
    { 
     char line[128];   /* or other suitable maximum line size */ 

     while (fgets(line, sizeof line, file) != NULL) /* read a line */ 
     { 
      fputs(a, file);  /* write the line */ 
     } 
     fclose(file); 
    } 
    else 
    { 
     perror(filename);  /* why didn't the file open? */ 
    } 
    return 0; 
} 

いくつかの回答はバッファに言及しています。
ここでバッファーとちょっと混乱します。それは、私は複数の行をメモリに読み込んでそれを修正しなければならないということですか?そしてバッファリングはJavaのBufferedReaderクラスと同じですか?

+0

ファイルの内容を上書きしたり、バッファを使用してファイルの内容全体を置き換えたりするため、これを行うことはできません。 –

+0

コードに関連しないので、C++の言及を削除しました。 – MSalters

+0

あなたが何をしたいのかははっきりしていません。あなたは何を追加しようとしていますか?そして終わりではない場合はどこに追加しようとしていますか?おそらく、意図した入力と出力の例が役に立ちます。 – kaylum

答えて

2

各行を一度に1つずつ読み込んで修正し、行全体をに新しいファイルに書き直す必要があります。次に、ファイル全体を読み終えたら、新しいファイルの名前を古いファイルの名前に変更します。

それともあなたは、配列の中に、たとえば、メモリにファイル全体を読んで、配列の要素ごとに1つの行は、行を変更し、ファイルの内容を上書きします。

可変長のテキストファイルを変更する際の問題は、挿入ポイントの後ろにあるすべてのデータをnee4dにシフトすることです。これはファイルでは簡単ではありません。そのため、ファイル全体をメモリに読み込んでそこで変更を行う方が簡単です。または、名前を変更した一時ファイルを使用する方が簡単です。

+1

一時ファイルを使用する方が安全です。最悪の瞬間にクリティカルなバグが発生した場合、ファイルは少なくとも一時ファイルに存在するはずです。メモリメソッドから上書きすると、ファイル全体が失われる可能性があります。 – jdarthenay

2

ファイルは、自由に追加して操作できる行の配列として格納されません。これらの行は、解釈するデータの大きな部分です。そのようなことをするなら、現在の行に続くファイルの残りの部分を上書きします。

あなたがしなければならないことは、いつでもファイルの残りの部分をすべて書き直すことです。あなたはバッファを使って簡単にそれを行うことができます。

ファイル内の行は、改行文字でマークされた書式設定および論理ポイントにすぎません。

+0

助けてくれてありがとう! – Jutta

関連する問題