在文件纯c代码的行尾添加文本

时间:2012-09-14 07:55:27

标签: c file-io

我需要在文件的每一行末尾添加一个文本。我有以下代码:

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);
            }

}

我编辑了我的代码。还是行不通 但它不起作用。为什么呢?

2 个答案:

答案 0 :(得分:4)

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

  1. 从原始文件中读取,将想要的文本附加到行,并写入临时文件
  2. 从临时文件重命名(或复制)到原始文件
  3. 编辑:我的回答的伪代码:

    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);
    

答案 1 :(得分:0)

除非文件是内存映射的,否则fgets会返回一个指向原始缓冲区的指针(它不会。它需要追加null。)并且strcat就地运行(确实如此),那么你就不存储任何内容,只是弄乱了一些记忆。即使它确实有效,你也会覆盖下一行的一部分。 你需要

  • 写入临时文件并在关闭原始文件后重命名(按照Joachim Pileborg的建议)。
  • 写入内存中的缓冲区并在阅读完毕后将其保存到文件中。
  • 一次性将文件读入内存,然后逐行开始读取缓冲区。