2016-07-24 100 views
-1

我有一些代碼,像這樣寫一個char *二進制文件:字符串寫入到二進制文件用C

FILE *fp = fopen(path, "wb"); 
if (fp == NULL) { 
    printf("Failed to open file at path: %s. %s\n", path, __PRETTY_FUNCTION__); 
    return; 
} 

fwrite("Hello", 6, 1, fp); 

的問題是,當我再從該文件中像這樣寫着:

FILE *fp = fopen(path, "rb"); 
if (fp == NULL) { 
    printf("Failed to open file at path: %s. %s\n", path, __PRETTY_FUNCTION__); 
    return; 
} 


char *str; 
fread(str, 6, 1, fp); 
printf("Got str: %s\n", str); 

我得到不同的結果,例如OelloMello。到底是怎麼回事?

+0

你從來沒有設置'char * str'或者我錯了嗎? –

+2

發佈**全部**您的代碼。你發佈的代碼已經讀入'id':'fread(id,6,1,fp);'(* maybe * reading - 你不檢查返回值...),但是你發出任何內容未初始化的變量'str'指向:'printf(「Got str:%s \ n」,str);' –

+0

對不起,這是一個錯字。我正在閱讀str變量。該ID來自以前的實現,我改變了str,所以我可以測試出了什麼問題。 –

回答

1

該代碼是不正確:

char *str; 
fread(str, 6, 1, fp); 
printf("Got str: %s\n", str); 

char *str;創建未初始化字符指針。它指向的內存在哪裏?

char str[ 7 ]; 
fread(str, sizeof(str) - 1, 1, fp); 
str[ sizeof(str) - 1 ] = '\0'; 
printf("Got str: %s\n", str); 

效果會更好,但它仍無法從fread()檢查返回值,以確保數據的實際讀取。

+0

啊。是的,我的壞。我認爲指針後面的內存將被'read'安全地填充。所以'read'會創建char數組並將str *設置爲指向它。 –

0

您還沒有分配的內存爲str

char *str ; // You haven't allocated memory for it , Do 
str=malloc(6*sizeof *str); 

然後做

fread(str, 6, 1, fp); 

而且,如果寫入和讀取同一翻譯單元發生,你應該做的

fclose(fp); // to flush the output buffer and close the file descriptor 

從文件讀取之前