|13 檔案資料讀寫
|檔案與儲存的資料 C 語言的原始程式碼檔案是一種純文字檔。 以 .c 命名,儲存原始程式碼的內容文字。 13.1 檔案與資料 |檔案與儲存的資料 C 語言的原始程式碼檔案是一種純文字檔。 以 .c 命名,儲存原始程式碼的內容文字。 將副檔名調整為 .txt ,也可以透過文字編輯器開啟。 | 開啟檔案 >>
13.1 檔案與資料 |開啟檔案 << 檔案與儲存的資料 檔案讀寫 >>
13.1 檔案與資料 |檔案讀寫 << 開啟檔案 檔案處理函數 >>
13.2 檔案處理函數 |檔案處理函數 << 檔案讀寫 fopen() >>
|fopen() FILE *fopen(const char* ,const char*) 13.3 檔案操作 13.3.1 開啟檔案 << 檔案處理函數 fopen() >>
|fopen() FILE *fopen(const char* ,const char*) 13.3 檔案操作 |fopen() 13.3.1 開啟檔案 FILE *fopen(const char* ,const char*) fopen 以 「*」 標示,是一個指標,表示回傳值是一個位址 透過回傳的指標取得此開啟的檔案,進一步對其進行存取。 第一個引數為所要開啟的檔案路徑名稱字串,例如 C:\\cexample\\myfile.txt 第 2 個引數則是檔案的開啟模式 12 11 10 9 8 7 6 5 4 3 2 1 << fopen() 範例:開啟檔案 >>
|範例:開啟檔案 找不到檔案 找到檔案 13.3 檔案操作 13.3.1 開啟檔案 4 3 2 1 << fopen() fclose() >>
|fclose() int fclose(File *) 將不需要的關閉檔案避免資源浪費 檔案讀寫的緩衝區問題 指標變數表示所要關閉的檔案 13.3 檔案操作 |fclose() 13.3.2 關閉檔案 int fclose(File *) 12 將不需要的關閉檔案避免資源浪費 檔案讀寫的緩衝區問題 指標變數表示所要關閉的檔案 11 10 9 8 7 6 5 4 3 2 1 << 範例:開啟檔案 範例:關閉檔案>>
13.3 檔案操作 |範例:關閉檔案 13.3.2 關閉檔案 2 1 << fclose() getc() >>
|getc() int getc(FILE *) 參數為所要讀取的檔案指標 針對此檔案讀取檔案中目前位置的下一個字元 13.4 檔案讀取 13.4.1 讀取單一字元 int getc(FILE *) 參數為所要讀取的檔案指標 針對此檔案讀取檔案中目前位置的下一個字元 << 範例:關閉檔案 範例:讀取檔案內容 >>
|範例:讀取檔案內容 G 13.4 檔案讀取 13.4.1 讀取單一字元 4 3 2 1 << getc() 範例:迴圈讀取檔案內容 >>
|範例:迴圈讀取檔案內容 G O O D NIGHT AND GOOD LUCK 13.4 檔案讀取 13.4.1 讀取單一字元 6 12 5 11 4 10 3 9 2 8 1 7 G O O D NIGHT AND GOOD LUCK << 範例:讀取檔案內容 逐字元讀取 >>
|逐字元讀取 13.4 檔案讀取 13.4.1 讀取單一字元 << 範例:迴圈讀取檔案內容 << 範例:迴圈讀取檔案內容 範例:迴圈讀取檔案內容 >>
|範例:迴圈讀取檔案內容 …,32,76,85,67,75,-1 printf("%d,",c) ; 13.4 檔案讀取 13.4.1 讀取單一字元 printf("%d,",c) ; …,32,76,85,67,75,-1 2 1 << 逐字元讀取 範例:讀取指定數量字元的檔案內容 >>
|範例:讀取指定數量字元的檔案內容 13.4 檔案讀取 13.4.2 讀取字串 3 2 1 << 範例:迴圈讀取檔案內容 << 範例:迴圈讀取檔案內容 printf() >>
|printf() int putc(int c, FILE *fp); 第 1 個引數為寫入檔案的字元 第 2 個引數為寫入檔案的位址指標 13.5 檔案寫入 |printf() 13.5.1 寫入單一字元 int putc(int c, FILE *fp); 第 1 個引數為寫入檔案的字元 第 2 個引數為寫入檔案的位址指標 回傳寫入的字元,如果寫入失敗,則回傳 EOF 。 << 範例:讀取指定數量字元的檔案內容 範例:寫入單一字元 >>
|範例:寫入單一字元 13.5 檔案寫入 13.5.1 寫入單一字元 12 11 10 9 8 7 6 5 4 3 2 1 << printf() 範例:寫入單一字元 >>
|範例:寫入單一字元 13.5 檔案寫入 13.5.1 寫入單一字元 2 1 << 範例:寫入單一字元 << 範例:寫入單一字元 範例:寫入單一字元 >>
|範例:寫入單一字元 13.5 檔案寫入 13.5.1 寫入單一字元 FILE *of = fopen("C:\\hello.txt","a") ; 4 3 2 1 << 範例:寫入單一字元 範例:寫入字元陣列 >>
|範例:寫入字元陣列 13.5 檔案寫入 13.5.1 寫入單一字元 3 2 1 << 範例:寫入單一字元 << 範例:寫入單一字元 fputs() >>
|fputs() 第 1 個參數是字串,它會被寫入 fp 指標位址所指向的檔案 寫入的動作發生失敗,則會回傳 EOF 13.5 檔案寫入 |fputs() 13.5.2 寫入字串 int fputs(const char *s,FILE * fp); 第 1 個參數是字串,它會被寫入 fp 指標位址所指向的檔案 寫入的動作發生失敗,則會回傳 EOF << 範例:寫入字元陣列 範例:寫入字串 >>
13.5 檔案寫入 |範例:寫入字串 13.5.2 寫入字串 3 2 1 << fputs() 範例:檔案複製 >>
|範例:檔案複製 13.6 複製檔案 GOOD NIGHT AND GOOD LUCK 4 3 2 1 << 範例:寫入字串 << 範例:寫入字串 檔案關閉與緩衝區 >>
|檔案關閉與緩衝區 /* c = fclose(of) ; */ 程式在寫入檔案完成之後,不會自動關閉檔案 指定的字元並沒有寫入檔案 13.7 緩衝區 |檔案關閉與緩衝區 /* c = fclose(of) ; */ 程式在寫入檔案完成之後,不會自動關閉檔案 指定的字元並沒有寫入檔案 << 範例:檔案複製 無緩衝區讀寫 >>
|無緩衝區讀寫 13.8 無緩衝區資料讀寫 13.8.1 無緩衝區檔案讀寫函數 << 檔案關閉與緩衝區 << 檔案關閉與緩衝區 open() >>
|open() 第 1 個參數為所要開啟的檔案 第 2 個參數是開啟的模式 13.8 無緩衝區資料讀寫 |open() 13.8.2 開啟與關閉檔案 int open(const char *fpath,int openm [,int rwm]) ; 第 1 個參數為所要開啟的檔案 第 2 個參數是開啟的模式 第 3 個參數則是檔案的存取屬性,這個參數是選擇性的,只有在第 2 個參數是特定值情形下才有效果 3 2 1 << 無緩衝區讀寫 開啟常數合併 >>
|開啟常數合併 O_WRONLY | O_CREAT | O_APPEND 13.8 無緩衝區資料讀寫 13.8.2 開啟與關閉檔案 << open() 範例:開啟檔案 >>
|範例:開啟檔案 13.8 無緩衝區資料讀寫 13.8.2 開啟與關閉檔案 3 2 1 << 開啟常數合併 << 開啟常數合併 close() >>
|close() int close(int handle) ; 參數 handle 是所要關閉的檔案 也就是成功開啟檔案時所回傳的值 13.8 無緩衝區資料讀寫 |close() 13.8.2 開啟與關閉檔案 int close(int handle) ; 參數 handle 是所要關閉的檔案 也就是成功開啟檔案時所回傳的值 << 開啟檔案 範例:開啟與關閉檔案 >>
|範例:開啟與關閉檔案 開啟檔案代號:3 檔案順利關閉 13.8 無緩衝區資料讀寫 13.8.2 開啟與關閉檔案 5 4 3 2 1 << close() read() 與 write() >>
|read() 與 write() int read(int handle,char *buf,unsigned int count); 13.8 無緩衝區資料讀寫 |read() 與 write() 13.8.3 讀寫檔案 int read(int handle,char *buf,unsigned int count); 第 1 個參數 handle 為成功開啟檔案之後所回傳的檔案編號 第 2 個參數 buf 儲存所讀取的資料 第 3 個參數為所要讀取的位元組數目 回傳值如果是 -1 表示資料讀取失敗,否則表示 read() 實際讀取的位元組數目 int write(int handle,char *buf, unsigned int count); 第 1 個參數如上述,在這裡是指所要寫入的目標檔 案,接下來的 buf 則是要寫入檔案的內容 第 3 個參數則是所要寫入的位元組數目,回傳值則是實際寫入的位元組,如果是 -1 ,表示寫入失敗 << 範例:開啟與關閉檔案 範例:開啟複製 >>
|範例:開啟複製 13.8 無緩衝區資料讀寫 13.8.3 讀寫檔案 << read() 與 write() fread() 與 fwrite() >>
|fread() 與 fwrite() 13.9 二進位格式檔案讀寫 13.9.1 fread() 與 fwrite() << 範例:開啟複製 fopen() 與 fwrite() >>
|fopen() 與 fwrite() FILE *of = fopen("hellobin.bin","rb") ; 13.9 二進位格式檔案讀寫 |fopen() 與 fwrite() 13.9.1 fread() 與 fwrite() FILE *of = fopen("hellobin.bin","rb") ; 第 2 個參數指定了 rb ,因此會以二進位格式開啟 hellobin.bin ,以支援檔案讀取作業。 size_t fwrite(const void *pt, size_t size, size_t nmemb, FILE *fp); 第 1 個參數 pt 是要寫入檔案的資料位址指標 第 2 個參數 size 為每一次所要寫入的資料單位 第 3 個參數則是可能讀取的最大值 最後一個參數 fp 為資料讀取的來源檔案 回傳值代表成功寫入的元素數量,這個值會與第 3 個參數相同,除非 遇到寫入的錯誤。 << fread() 與 fwrite() 範例:寫入二進位格式檔案 >>
|範例:寫入二進位格式檔 總共寫入 3 個 int 13.9 二進位格式檔案讀寫 13.9.1 fread() 與 fwrite() 4 3 2 1 << fopen() 與 fwrite() fread() 與 fwite() >>
|fread() 與 fwrite() 寫入一般型態: int x = 100 ; 13.9 二進位格式檔案讀寫 |fread() 與 fwrite() 13.9.1 fread() 與 fwrite() 寫入一般型態: int x = 100 ; fwrite(&x,sizeof(int),1,of) ; 第 1 行是一個 int 型態的整數值 第 2 行將其寫入指定的目標檔案,其中的第一個參數必須指定為 &x 。 size_t fread(void * restrict pt, size_t size, size_t nmemb, FILE * restrict fp); 執行檔案的讀取動作,回傳值代表成功讀取的元素數量 << 範例:寫入二進位格式檔 範例:讀取二進位格式檔 >>
|範例:讀取二進位格式檔 總共讀取 3 個 int 100 200 300 13.9 二進位格式檔案讀寫 13.9.1 fread() 與 fwrite() 總共讀取 3 個 int 100 200 300 7 6 5 4 3 2 1 << fread() 與 fwrite() open() >>
|open() open(filepath, O_WRONLY|O_CREAT|O_BINARY,S_IWRITE) ; 13.9 二進位格式檔案讀寫 |open() 13.9.2 無緩衝區的檔案讀寫 open(filepath, O_WRONLY|O_CREAT|O_BINARY,S_IWRITE) ; 第 2 個參數指定了 O_BINARY ,如此一來就會以二進位格式的方式讀寫檔案。 << 範例:讀取二進位格式檔 範例:二進位檔案讀寫 >>
|範例:二維位檔案讀寫 寫入位元組:12 讀取位元組:12 讀取內容: 444 666 888 13.9 二進位格式檔案讀寫 13.9.2 無緩衝區的檔案讀寫 寫入位元組:12 讀取位元組:12 讀取內容: 444 666 888 4 3 2 1 << open() |