1. 程式人生 > >C語言常用檔案操作函式fprinf/fscanf與fwrite/fread

C語言常用檔案操作函式fprinf/fscanf與fwrite/fread

fprintf是將資料轉換為字元後再寫入檔案

fwrite是將資料不經轉換直接以二進位制的形式寫入檔案

一、fprintf函式。

fprintf(fp, "%d", buffer); 是將格式化的資料寫入檔案
fprintf(檔案指標,格式字串,輸出表列);

1.以文字的形式儲存檔案。函式原型為 int fprintf(FILE* stream,const char* format,[argument]),用法類似於printf函式,返回值是輸出的字元數,發生錯誤時返回一個負值。

2.對應的讀取函式為fscanf()。函式原型為int fscanf(FILE* stream,const char* format,[argument...])

,用法類似於scanf函式,返回值為成功讀入引數的個數,當讀到檔案末尾EOF時,返回-1。

二、fwrite函式。

fwrite(&buffer, sizeof(int), 1, fp);是以二進位方式寫入檔案
fwrite(資料,資料型別大小(位元組數),寫入資料的最大數量,檔案指標);

1.以二進位制形式儲存檔案。函式原型為size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream),引數依次為資料地址,資料元素大小,資料元素個數,檔案指標。返回值為實際寫入的資料的項數。

2.對應的讀取函式為fread。函式原型為size_t fread ( void *buffer

, size_t size, size_t count, FILE *stream,引數依次為資料地址,資料元素大小,資料元素個數,檔案指標。返回值為實際讀取的資料項數,當讀到檔案末尾的EOF時,返回0。


三、教材解析

------------------------------------------------------------------------------------

《計算機組成原理》
比如
int v=1;
fwrite(&v,sizeof(int),1,f);  //檔案中被寫四個位元組0x01 0x00 0x00 0x00(32位int,小端儲存)
fprintf(f,"%d",v);  //檔案中被寫一個位元組0x31(即'1'的ASCII碼)
又比如
int v=0x12345678;
fwrite(&v,sizeof(int),1,f);  //檔案中被寫四個位元組0x78 0x56 0x34 0x12(32位int,小端儲存)
fprintf(f,"%x",v);  //檔案中被寫八個位元組0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38
fprintf(f,"%d",v); //檔案中被寫九個位元組0x33 0x30 0x35 0x34 0x31 0x39 0x38 0x39 0x36
(因為0x12345678==305419896)

-----------------------------------------------------------------------------------

當使用fwrite將一個int型數字65寫入文字檔案時,由於65對應的二進位制數是1000001,十六進位制數是0x41,儲存的是以二進位制的形式1000001.在notepad++中使用十六進位制方式開啟顯示的是:0x0041,轉換為十進位制則為65,使用記事本開啟這個文字檔案後顯示的是A,因為記事本程式預設為儲存在文字檔案中的資料都是ASCII碼形式儲存,它把65當做ASCII碼翻譯為字元A。

當使用fpintf將一個int型數字65寫入文字檔案時,將65每一位轉換為ASCII碼儲存,6、5分別對應ASCII碼54、53,儲存的是ASCII碼54、53.在notepad++中使用十六進位制方式開啟顯示的是:3635,轉換為十進位制則為54、53,這正是數字6、5的ASCII碼。使用記事本開啟這個文字檔案時,記事本將儲存在其中的54、53當做ASCII碼翻譯為字元6、5顯示,我們看到的是便是字元65。

參考連結: