2012-07-14 118 views
2

特定行我有大約2000,我在我的程序生成的文本行的文件,每行有一個員工的信息,它的outputed這樣覆蓋在C

11艾​​薩克·豐塞卡58℃1600 1310.40 6 1 0.22 2164.80 1
2 1曼努埃爾Gutierrez的22 d 1700 1523.37 4 1 0.13 897.26 1
3 1丹尼爾貝納爾34 C 1600 1195.84 2 1 0.26 836.16 1
4 1米格爾岡薩雷斯部43e 1800 1195.84 0 1 0.15 0.00 1

但我每當我編輯員工信息我必須更新文件,我在做什麼這是我搜索該行,並嘗試重寫它

我見過以下問題的人有同樣的問題,但是當我嘗試寫入文件時,它始終寫入文件

overwriting a specific line on a text file?

這裏到底是我的代碼:

datos = fopen(archivo,"a+"); 
for(i=0;i<num;i++){ 
    // buscar la linea 
    fgets(lineaA,100,datos); 
    // sobreescribir 
    if(i == (num-1)) 
     cursor = ftell(datos);      
} 

cursor -= strlen(lineaA) - 1; 
fseek(datos,cursor,SEEK_CUR); 

fputs(linea2,datos);    
fclose(datos); 
+2

這是棘手的 - 'a +'打開追加,這不是你想要的。也許'r +',或者你必須使用不同的打開命令。但我從來沒有試過這樣做。 (請注意,您需要覆蓋原始行的相同字節數。) – 2012-07-14 22:36:52

+0

@HotLicks將其更改爲「r +」,並且它附加到代碼中的特定行,現在我只需要重新計算我的遊標位置,並使其刪除其他內容,因爲它只是追加它,它不會覆蓋它 – 2012-07-14 22:43:34

回答

3

你幾乎不能做到這一點。

您可以使用fseek轉到文件中的特定位置,並且可以將數據寫入該位置(您可能希望使用"r+"模式)。

但是文件通常以字節序列(或字符)存儲,而不是作爲一系列行。

如果你仔細寫出已經在該行中的完全相同的字節數,你可能會得到它 - 但在你的例子中,行的長度是不同的,所以這不是一個選項。

例如,您可以用空白填充每行,所以它們的長度都是相同的,但是如果使用普通的文本編輯器修改文件,則很容易破壞佈局。

對於文本文件,通常的做法是將文件讀入內存,修改內存中的表示形式,然後重新創建整個文件。您可能希望將內容寫入新的臨時文件,然後在確認沒有寫入錯誤後重命名它。

這是文本編輯通常會做的事情。

(不要太擔心效率; 2000線是不是所有的大,你不會注意到它需要給他們寫的時間。)

還有其他選擇。您可以定義具有固定長度記錄的二進制格式,也可以使用數據庫。或者,您可以將新行添加到文件中,並將一樣視爲已被刪除(但如果進行大量更新,則會導致文件變大)。

+0

你可以命名任何文本編輯器,遵循你慣常的apparoch? – overexchange 2017-01-02 03:22:20

+0

@proxchange:vim,emacs – 2017-01-02 07:25:06

0

你通過選項「打開文件+ 「,其中y允許你追加到文件中,而不是覆蓋。你想用「r +」

datos = fopen(archivo,"r+); 
1

除非這是類似於家庭作業的事情,您需要自行滾動所有代碼,否則切換到數據庫可能是最容易的。鑑於你有其他的代碼工作,SQLite可能是最明顯的選擇。如果你真的想堅持(至少類似於)你當前的格式和代碼,我可能會寫入每行填充64或128字節的數據(如果你有幾條記錄更長時間,隔離它們,例如將它們全部移到文件的末尾,或將它們放在單獨的文件中)。這種方式(大多數?)編輯可以在不影響其他行的情況下完成。如果你有一個僱員的行的索引,你也可以直接找到該行,而不是閱讀所有的前輩找到它。

+0

這是一個家庭作業,所以我必須這樣做,我會更喜歡使用數據庫 – 2012-07-14 23:05:37