2013-04-14 34 views
0

我無法理解爲什麼我的代碼不能按預期工作,我確信它與我對fread和fwrite的理解有關。使用fread&fwrite,與二進制相關

這是我的代碼的片段,原諒格式和懶惰的風格。

typedef struct record_t{ 
char name[20]; 
unsigned int id; 
char toy[30]; 
}record_t; 



int main(int argc, char** argv){ 


FILE *readFile, *writeFile; 
record_t *recordPtr; 
int i; 

if((recordPtr = malloc(sizeof(struct record_t))) == NULL) 
{ 
    perror("Error allocating record space\n"); 
    exit(EXIT_FAILURE); 
} 

strcpy(recordPtr->name, "Michael"); 
recordPtr->id = 3; 
strcpy(recordPtr->toy, "Hello Kitty"); 
printf("Writing %s - %d - %d - %d - %s\n", recordPtr->name, 
    recordPtr->id, recordPtr->toy); 

if((writeFile = fopen("test.bin", "wb")) == NULL) 
{ 
    perror("Error opening writing file\n"); 
    exit(EXIT_FAILURE); 
} 

for(i = 0; i < 2; ++i){ 
recordPtr->id = i ; 
fwrite(&recordPtr, sizeof(struct record_t), 1, writeFile); 
printf("%s - %d - %s, ", recordPtr->name, recordPtr->id, recordPtr->toy); 
printf("Record Written.\n"); 

} 
fclose(writeFile); 

recordPtr = NULL; 

if((readFile = fopen("test.bin", "rb")) == NULL) 
{ 
    perror("Error opening reading file\n"); 
} 
    exit(EXIT_FAILURE); 

recordPtr = NULL; 


for(i=0; i < 2; ++i){ 
    fread(&recordPtr, sizeof(struct record_t), 1, readFile); 
    printf("%s - %d - %s, Read back.\n" recordPtr->name, recordPtr->id, recordPtr->toy); 
} 
fclose(readFile); 


exit(EXIT_SUCCESS); 
} 

代碼的想法只是記錄一下,寫入二進制文件,然後從二進制文件中讀回來。 我的問題是隻有最後一個條目被讀回,所以我確定我對fread的理解有問題。

提前感謝您。

+0

你是說當它通過讀取循環時,它會全部三次打印id 2,而不是0,1,2? – Barmar

+0

我認爲問題在於正在寫入的記錄是同一條記錄,一遍又一遍。所以而不是看到記錄0然後1然後2等我看到最後一個記錄寫1,然後1,然後1. – husked

+0

你讀過20分鐘前發佈的答案嗎? – Barmar

回答

1
fwrite(&recordPtr, sizeof(struct record_t), 1, writeFile); 
fread(&recordPtr, sizeof(struct record_t), 1, readFile); 

應該是:

fwrite(recordPtr, sizeof(struct record_t), 1, writeFile); 
fread(recordPtr, sizeof(struct record_t), 1, readFile); 

下一頁:

if((readFile = fopen("test.bin", "rb")) == NULL) 
{ 
    perror("Error opening reading file\n"); 
} 
exit(EXIT_FAILURE); 

應該

if((readFile = fopen("test.bin", "rb")) == NULL) 
{ 
    perror("Error opening reading file\n"); 
    exit(EXIT_FAILURE); 
} 

而且

當你讀取結構時,緩衝區指向NULL! 因此,在fread中使用recordPtr之前,請確保您分配內存並使recordPtr指向它。

+0

這個答案解決了我關於fread的問題,但是在閱讀時我修正了這個問題,我沒有收到任何迴應。因此,我在記錄中閱讀的方式有更多問題。 謝謝你。 – husked

1

fwrite(&recordPtr, sizeof(struct record_t), 1, writeFile); 

不是寫結構的文件,它的企圖,接着後面的任何內容在內存中的指針recordPtr寫信給它。

同樣這

fread(&recordPtr, sizeof(struct record_t), 1, readFile); 

不讀書結構爲你分配給它的內存,它嘗試覆蓋指針recordPtr和它後面的任何內容與文件數據存儲。

您需要刪除該符號。

相關問題