2016-04-22 134 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

使用臨時文件更安全。在最糟糕的時刻出現嚴重錯誤的情況下,您的文件至少應該位於臨時文件中。隨着記憶方法的覆蓋,您可能會丟失整個文件。 – jdarthenay

2

文件不是以您可以隨意添加和操作的行數組形式存儲的,它們是您解釋的一大塊數據。所以如果你要做這樣的事情,你會覆蓋當前行後面的文件的其餘部分。

只要你這樣做,你所要做的就是重寫至少整個文件的其餘部分。您可以使用緩衝區輕鬆完成此操作。

文件中的行只是格式和由換行符標記的邏輯點。

+0

感謝您的幫助! – Jutta

相關問題