2013-10-15 61 views
0

我目前在Windows XP中使用MinGW。如何在特定行編輯文本文件C

我編寫了一個程序,它接受用戶的輸入,並將它們放入.txt文件通過

typedef struct data_base{ 
    char name[254]; 
    int age; 
    int postalcode; 
    struct data_base *next; 
}person; 

我想知道是否有編輯.txt文件的數據的方法。

例如,在.txt文件,我有3套基於用戶輸入的數據:

Steven //name 
19  //age 
1100  //postal code 
Jack 
24 
2203 
Mary 
21 
0109 

我會問哪一組,他希望編輯數據的用戶。然後,在完成編輯的數據之後,我希望在用戶選擇的特定集合的.txt文件中覆蓋該數據。


#include <stdio.h> 
#include <stdlib.h> 

typedef struct data_base{ 
    char name[254]; 
    int age; 
    int postalcode; 
    struct data_base *next; 
}person; 

void read() 
{ 
person *curr[20]; 
int count = 0; 
FILE *f; 
int editchoice = 0; 

f = fopen("personfile.txt","r+"); 
// Read the data in the file based on user's input 

//Display the names: 1. Steven 2.Jack 3.Mary 
printf("Editing Whose Data?: \n"); 
scanf("%d",&editchoice);  

printf("New name: \n"); 
scanf("%s",&curr[editchoice]->name); 
fprintf(f,"%s\n",curr[editchoice]->name); 

printf("New age: \n"); 
scanf("%d",&curr[editchoice]->age); 
fprintf(f,"%d\n",curr[editchoice]->age); 

printf("New name: \n"); 
scanf("%d",&curr[editchoice]->postalcode); 
fprintf(f,"%d\n",curr[editchoice]->postalcode); 

} 

我預期的數據將被覆蓋,但情況並非如此。 (對不起,初學者。)

+1

你能顯示你試過的代碼嗎? –

+0

@PaulGriffiths好吧。 – user2882762

+0

爲什麼你期望文件被更新?你沒有更新它。爲了更新文件,您需要將文件定位到要更新的記錄並使用'fwrite'覆蓋它。 –

回答

0

是的,你幾乎在那裏。

對我來說,你有兩種選擇。 或者您在內存中更改該文件(在列表中)並將該列表轉儲到文件中之後。 或者您更改文件,並將該文件重新讀入內存(到該列表中)。

或者

您可以通過在你想改變,改變它,但你也應該在內存中更新數據的數據的開始定位文件指針更改文件中的數據。

我對這個問題的辦法是:

寫給人一種「ID」位置的人一個塊文件中的函數,這樣你可以讀取和寫入數據的人到文件中。

+0

由於數據的長度是可變的,因此您必須覆蓋要更改的記錄以及之後的所有記錄。 –

+0

是的你是對的,但我看到 char name [254]; int age; int postalcode; 名稱將保存最多254字節(字符)。 該塊中的所有數據的最大長度爲 254 + 4 + 4 = 258個字節。 未使用的字符可以放在'\ 0'字符中。 而你有258個字節的塊。 –

+0

是的,你可以使用固定的記錄長度來避免重寫大部分文件。這是一個涉及磁盤空間和性能之間權衡的設計決策。 –

0

您可以從文件中讀取,然後將結果寫入另一個文件。

通過記錄讀取記錄,

如果記錄有個人,你想改變再改變

然後

dump記錄在您閱讀到一個tmp文件,這將包括更改的記錄時發生。

然後關閉這兩個文件,remove舊文件,rename的tmp文件。

+0

如果該文件包含數百萬條記錄,該怎麼辦?重寫數百萬條記錄只改變一條記錄非常昂貴。 –

+0

我同意你的觀點,但是對於初學者來說,這是一個好的開始。特別是在相同的文件上準備和寫入可能會導致問題,如果不小心 – aah134