2017-08-04 159 views
-4

使用fwrite的功能我不能understasnd finction如何FWRITE在CI工作做了交流program.here其它: -在哪裏以及如何在C

#include <stdio.h> 

int main() 
{ 
struct books 
{ 
    char name[100]; 
    float price; 
    int pages; 
}book1; 

puts("enter the name of the book");gets(book1.name); 
puts("enter the price of the book");scanf("%f",&book1.price); 
puts("enter the pages of the book");scanf("%d",&book1.pages); 

FILE *b=fopen("Book.txt","w"); 
fwrite(&book1,sizeof(book1),1,b); 
} 

這裏是個節目的輸入: -

$ ./a.out 
enter the name of the book 
Voldemort the last BSD user 
enter the price of the book 
40000 
enter the pages of the book 
34 

,這裏是該文件的內容: -

$ cat Book.txt 
    Voldemort the Great Linux and bsd user!����c����@�@��,B 

因此,什麼是錯在我的計劃? fwrite如何工作?我應該什麼時候使用它?

+0

你的程序出了什麼問題取決於你在第一時間預期的輸出。 –

+0

您需要聲明變量類型book1,同時忘記關閉文件 –

+1

, c @ @ ,B部分(16字節)實際上是您的價格(8字節)和頁面數據(8字節)。您首先需要了解C/C++如何管理數據,然後才能將文件保存到文件中 –

回答

1

沒有立即錯了你的程序,除非你使用gets(),這是非常錯誤(保證緩衝區溢出),但無關你的問題,所以我就離開這裏提示:使用fgets(),以及常規信息如何可靠地獲得C輸入,我建議你閱讀

至於你的問題,fwrite()寫入無論你給它恰好它在你的計算機的內存一樣的文件。您可以再次使用fread()再次讀取該文件,並以相同的struct結尾。但知道數據類型的表示是實現定義。所以你不能在另一臺機器上讀取這個文件,或者甚至在同一臺機器上使用不同編譯器編譯的程序。因此,使用fwrite()來編寫整個struct在實踐中使用非常有限。

至於爲什麼你看到「奇怪的東西」與cat,這僅僅是因爲cat解釋所有文件內容的字符。如果您只是直接寫floatintstdout,而不是格式的它與printf()

要以便攜的方式將struct寫入文件,您必須應用某種數據序列化。一個非常簡單的方法是使用fprintf()以合理的格式字符串。有很多可能性,你可以對適當的JSON庫使用JSON格式,對於XML也是如此。

-2

這是正確的。 fwrite寫入寫入文件二進制文件,使文件中的結構佔用的內存的確切副本。如果要以文本形式保存二進制成員/字段,則需要對其進行序列化,即將二進制數據轉換爲文本並將轉換後的數據寫入文件。

例如,而不是fwrite使用fprintf

fprintf(b, "%s,%f,%d\n", book1.name, book1.price, book1.pages); 
+0

因此'fwrite'用於寫入二進制文件? – voldimot

+3

@voldimot一切都是二進制數據,「文本數據」只是二進制數據加上給定的數據解釋 –

+1

@PeterJ我認爲OP的fwrite解決方案和你的解決方案都是有效的。我們在這裏所缺少的是將這樣的數據存儲到文件 –

相關問題