将每行末尾的元素添加到文件中

问题描述:

我想逐行添加元素到文件中,而不是文件的末尾。 我写了这段代码,但结果是我只能在文件末尾附加元素。将每行末尾的元素添加到文件中

#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

您需要一次读取一行,按照您认为合适的方式进行修改,然后将整行重写为新文件。然后,当您读完整个文件时,将新文件重命名为旧文件。

或者您读取整个文件到存储器中,例如到一个数组,每所述阵列的元件的一行,修改线,和覆盖该文件的内容。

修改可变长度文本文件的问题在于,您需要将插入点之后的所有数据移位,这在文件中并不容易。这就是为什么将整个文件读入内存并在其中进行修改或使用临时文件然后重命名的原因。

+1

使用临时文件更安全。在最糟糕的时刻出现严重错误的情况下,您的文件至少应该位于临时文件中。随着记忆方法的覆盖,您可能会丢失整个文件。 – jdarthenay

文件不是以您可以随意添加和操作的行数组形式存储的,它们是您解释的一大块数据。所以如果你要做这样的事情,你会覆盖当前行后面的文件的其余部分。

只要你这样做,你所要做的就是重写至少整个文件的其余部分。您可以使用缓冲区轻松完成此操作。

文件中的行只是格式和由换行符标记的逻辑点。

+0

感谢您的帮助! – Jutta