1

ファイルの各行の最後にテキストを追加する必要があります。私は次のコードを持っています:

FILE *tmp_copy = tmpfile();
file = fopen ( argv[2], "rw" );    
if ((file != NULL )) {
    char line [ 128 ]; /* or other suitable maximum line size */
    while( ( fgets ( line, sizeof line, file ) != NULL ))  {
       fputs(line, tmp_copy);
    }
    fclose ( file );

        rewind(tmp);
        char *p;
      /* Reopen file now with write permissions */
        fopen(argv[2], "w");
        while (( p = fgets(line, 1024, tmp))!=NULL) {
            //line[strlen(line)-1] = '\0'; /* Clear away newline */
            //sprintf(line, "%s %s\n", line, more);
            strcpy(line,"true");
            //fputs(line, file);
        }
fclose(file);
fclose(tmp);
            }

}

コードを編集しました。まだ機能していませんが、機能していません。なぜ?

4

2 に答える 2

4

行をファイルに再度書き直してほしいと思います。ただし、ファイルに書き込むのではなく、メモリ内のデータに追加するだけです。また、そのようにファイルの読み取りと書き込みを同時に行うことは実際には不可能です。2つのステップで行う必要があります。

  1. 元のファイルから読み取り、必要なテキストを行に追加し、一時ファイルに書き込みます
  2. 一時ファイルから元のファイルに名前を変更(またはコピー)します

編集:私の答えのための疑似っぽいコード:

original_file = fopen(original_file_name, "r");
temporary_file_name = tmpnam("dummy");
temporary_file = fopen(temporary_file_name, "w");

while (fgets(line, original_file))
{
    remove_trailing_newline(line);
    strcat(line, " TRUE\n");
    fputs(line, temporary_file);
}

fclose(temporary_file);
fclose(original_file);

rename(temporary_file_name, original_file_name);
于 2012-09-14T07:59:10.433 に答える
0

ファイルがメモリマップされていて、fgetsが元のバッファへのポインタを返しない限り(そうではありません。nullを追加する必要があります)、strcatがその場で動作し(動作します)、何も保存せず、混乱するだけです。いくつかのメモリ。それが機能したとしても、とにかく次の行の一部を上書きします。あなたはどちらかをする必要があります

  • 一時ファイルに書き込み、元のファイルを閉じた後で名前を変更します(Joachim Pileborgの提案による)。
  • メモリ内のバッファに書き込み、読み取りが完了したらファイルに保存します。
  • ファイルを一度にメモリに読み込んでから、バッファを1行ずつ読み取り始めます。
于 2012-09-14T08:08:02.333 に答える