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

我猜您希望该行再次重新写入文件。但是,您没有写入文件,只是附加到内存中的数据。像这样同时读取和写入文件也是不可能的,你必须分两步完成:

  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 返回一个指向原始缓冲区的指针(它没有。它需要附加空值。)并且 strcat 就地操作(它确实如此),那么你不会存储任何东西,只会搞砸一些记忆。即使它确实有效,你还是会覆盖下一行的一部分。你需要要么

  • 在关闭原始文件后写入一个临时文件并重命名(如 Joachim Pileborg 所建议)。
  • 写入内存中的缓冲区并在完成读取后将其保存到文件中。
  • 一口气将文件读入内存,然后开始逐行读取缓冲区。
于 2012-09-14T08:08:02.333 回答