2013-05-08 102 views
1

我試圖使用fopen的「r +」模式將編號添加到現有.txt文件中的多行文本。這似乎不起作用,它最終寫了字符串「行」的第一個迭代,然後是大量的垃圾值。有什麼方法可以在一行的開頭添加文本?如果是這樣,我是以錯誤的方式來到這裏嗎?C編程;在文件的開頭添加字符串

也即時嘗試這樣做,而不必寫出一個全新的文件。

void main() 
{ 
    char read = ' '; 
    char buffer[25]; 
    char line[4] = "01."; //lines from 01 to 99 
    FILE *file; 
    file = fopen("readme.txt","r+"); 
    if (file == NULL) 
    { 
     printf("ERROR: Cannot open input file.\n"); 
     exit(); 
    } 
    do 
    { 
     fwrite(line,strlen(line),1,file); 
     read=gets(buffer); 
     if(!feof(file)) // updating line numbers 
     { 
      if(line[1]<'9') 
      { 
       (line[1])++; 
      } 
      else 
      { 
       if(line[0]<'9') 
       { 
        (line[0])++; 
       } 
       else 
       { 
        exit(); 
       } 
      } 
     } 
     else 
     { 
      exit(); 
     } 
    }while(!(feof(file))); 
    fclose(file); 
    exit(); 
} 
+0

如果達到99行,您可以通過加載所有內存來完成工作。 – BLUEPIXY 2013-05-08 10:37:20

+0

爲什麼你應該避免寫入新文件。我覺得這是最安全的選擇.. – VoidPointer 2013-05-08 10:39:19

+0

我只是想弄清楚是否有另一種方式來做到這一點 – 2013-05-08 11:55:31

回答

2

C中的文件允許您覆蓋和追加,但不能「預先加載」數據。要在開始或中間插入,您必須手動複製「尾部」。

如果您正在編寫一個行號編程程序,將結果寫入單獨的臨時文件會更簡單(並且更快),然後在操作完成後將其複製到原始位置。

您可以使用一個簡單的循環,讀取原始文件中的行由行,並寫入輸出文件,例如,與fprintf

fprintf(outFile, "%02d.%s", lineNumber++, lineFromOrigFile); 
1

不,沒有可行的/標準的做你想做的方式。

文件是隨機訪問,但不能將數據插入文件,因爲這將迫使所有其他的數據移動,這是不是典型的文件系統所支持的操作。

最好的解決辦法是做的兩個步驟:

  1. 通讀輸入,同時將輸出寫入到一個新文件
  2. 重命名新文件,以取代原來的輸入
0

在文件的開頭添加字符串就像插入。
而你不能真的直接使用C插入字符串,而是覆蓋舊的內容。
所以你只能做一個大修到文本文件: 記錄舊文件內容的地方(臨時文件或內存...等),寫你的字符串,然後粘貼舊的內容了。