2010-03-07 34 views
3

我有一個包含記錄的二進制文件。該文件的結構是這樣的:fread/fwrite在C中的字符串

結構(見下文) 名稱串 地址字符串

有問題的結構:

typedef struct{ 
    char * name; 
    char * address; 
    short addressLength, nameLength; 
    int phoneNumber; 
}employeeRecord; 
employeeRecord record; 

我得到的名稱,例如:

char name[50]; 
printf("\nName:"); 
fgets(name,50,stdin); 
record.nameLength = strlen(name)-1; 
record.name = malloc(sizeof(char)*record.nameLength); 
strcpy(record.name,name); 

我寫的結構,名稱,然後地址(如上所述)。

fwrite(&record.name,sizeof(char),record.nameLength,fp); 

其中fp是文件指針。

現在我關閉文件。然而,如果我然後想從文件中讀取數據以獲取此數據,我相信我需要讀取結構,讀取nameLength變量,malloc足夠的內存以便名稱坐下,然後將名稱變爲變量。

像這樣:

char *nameString = malloc(sizeof(char)*record.nameLength); 
fread(nameString,sizeof(char),record.nameLength,fp); 
printf("\nName: %s",nameString); 

然而,當我嘗試這一點,我沒有得到有效的數據。 例子:

Input name is: Joseph (6 characters) 
Output data: 
Name length is 6 (correct), 
Name is �A  � (aka garbage) 

所以很明顯的IM做得不對。有人能給我一些幫助嗎?

+1

它不會解決任何問題,但是您可以使用'strdup'而不是'strlen' +'malloc' +'strcpy'。 – zneak 2010-03-07 19:58:33

+0

這是一項家庭作業嗎? – 2010-03-07 19:59:31

+0

添加了作業標籤,忘記了這一點。 – Blackbinary 2010-03-07 20:13:51

回答

1

的問題是,你通過指針char*在你的fwrite:

fwrite(&record.name,sizeof(char),record.nameLength,fp); 

這意味着,而不是寫名字,你寫名字的內存地址。 Fwrite需要一個指向要寫入的數據的指針 - 在您的情況下,這是指向數據的指針,而不是指向數據指針的指針。

通過它record.name而不是&record.name,你應該設置:

fwrite(record.name, sizeof(char), record.nameLength, fp); 
2

我看到兩個問題寫,要設置record.nameLength太小,而你傳遞了錯誤的指針爲名字寫fwrite。 record.name已經是一個指針。

更改此

record.nameLength = strlen(name)-1; 
... 
fwrite(&record.name,sizeof(char),record.nameLength,fp); 

這個

record.nameLength = strlen(name); 
... 
fwrite(record.name,sizeof(char),record.nameLength,fp); 

您也可以在讀一個問題,因爲你沒有寫從字符串結尾的\ 0到您的文件,當你回讀一下,你需要明確地添加終止符。

char *nameString = malloc(sizeof(char)* (record.nameLength + 1)); 
fread(nameString,sizeof(char),record.nameLength,fp); 
nameString[record.NameLength] = '\0'; 
+0

爲什麼我需要空終止符?我知道我會讀的大小,所以我不想把它切掉? – Blackbinary 2010-03-07 20:09:15

+0

另外,如果我使用名稱'M'作爲例子,使用'record.nameLength = strlen(name)'返回2的長度,而不是1. – Blackbinary 2010-03-07 20:12:50

+0

strlen在其長度中不包含空終止符。 (除非你寫了你自己的strlen函數?),strlen(「M」)將返回1,而不是2. – 2010-03-07 20:26:24