| 13  檔案資料讀寫

40
C 語語語語語語 13 語語語語語語

Upload: xenon

Post on 19-Mar-2016

74 views

Category:

Documents


3 download

DESCRIPTION

| 13  檔案資料讀寫. 13.1 檔案與資料. | 檔案與儲存的資料. C 語言的原始程式碼檔案是一種純文字檔。 以 .c 命名,儲存原始程式碼的內容文字。 將副檔名調整為 .txt ,也可以透過文字編輯器開啟。. |.  開啟檔案 >>. 13.1 檔案與資料. | 開啟檔案. >. 13.1 檔案與資料. | 檔案讀寫. >. 13.2 檔案處理函數. | 檔案處理函數. >. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: | 13  檔案資料讀寫

C 語言入門經典

| 13  檔案資料讀寫

Page 2: | 13  檔案資料讀寫

C 語言入門經典  開啟檔案 >> |

|檔案與儲存的資料 13.1 檔案與資料

• C 語言的原始程式碼檔案是一種純文字檔。• 以 .c 命名,儲存原始程式碼的內容文字。• 將副檔名調整為 .txt ,也可以透過文字編輯器開啟。

Page 3: | 13  檔案資料讀寫

C 語言入門經典  檔案讀寫 >> << 檔案與儲存的資料  

|開啟檔案 13.1 檔案與資料

Page 4: | 13  檔案資料讀寫

C 語言入門經典  檔案處理函數 >> << 開啟檔案  

|檔案讀寫 13.1 檔案與資料

Page 5: | 13  檔案資料讀寫

C 語言入門經典   fopen() >> << 檔案讀寫  

|檔案處理函數 13.2 檔案處理函數

Page 6: | 13  檔案資料讀寫

C 語言入門經典   fopen() >> << 檔案處理函數  

| fopen() 13.3 檔案操作

FILE *fopen(const char* ,const char*)

13.3.1 開啟檔案

Page 7: | 13  檔案資料讀寫

C 語言入門經典

5

4

3

2

1

 範例:開啟檔案 >> << fopen()   

6

7

8

9

10

11

12

FILE *fopen(const char* ,const char*)

| fopen() 13.3 檔案操作

13.3.1 開啟檔案

• fopen 以 「 * 」 標示,是一個指標,表示回傳值是一個位址• 透過回傳的指標取得此開啟的檔案,進一步對其進行存取。• 第一個引數為所要開啟的檔案路徑名稱字串,例如 C:\\cexample\\m

yfile.txt

• 第 2 個引數則是檔案的開啟模式

Page 8: | 13  檔案資料讀寫

C 語言入門經典

4

3

2

1

  fclose() >> << fopen()   

|範例:開啟檔案 13.3 檔案操作

13.3.1 開啟檔案

找不到檔案找到檔案

Page 9: | 13  檔案資料讀寫

C 語言入門經典

5

4

3

2

1

 範例:關閉檔案 >> << 範例:開啟檔案  

6

7

8

9

10

11

12

| fclose()13.3 檔案操作

13.3.2 關閉檔案

int fclose(File *)

• 將不需要的關閉檔案避免資源浪費• 檔案讀寫的緩衝區問題• 指標變數表示所要關閉的檔案

Page 10: | 13  檔案資料讀寫

C 語言入門經典2

1

  getc() >> << fclose()   

|範例:關閉檔案 13.3 檔案操作

13.3.2 關閉檔案

Page 11: | 13  檔案資料讀寫

C 語言入門經典  範例:讀取檔案內容 >> << 範例:關閉檔案  

| getc()13.4 檔案讀取

13.4.1 讀取單一字元

int getc ( FILE * )• 參數為所要讀取的檔案指標• 針對此檔案讀取檔案中目前位置的下一個字元

Page 12: | 13  檔案資料讀寫

C 語言入門經典

4

3

2

1

 範例:迴圈讀取檔案內容 >> << getc()   

|範例:讀取檔案內容 13.4 檔案讀取

13.4.1 讀取單一字元

G

Page 13: | 13  檔案資料讀寫

C 語言入門經典  逐字元讀取 >> << 範例:讀取檔案內容  

|範例:迴圈讀取檔案內容 13.4 檔案讀取

13.4.1 讀取單一字元

NIGHT AND GOOD LUCKGOOD

5

4

3

2

1

6

7

8

9

10

11

12

Page 14: | 13  檔案資料讀寫

C 語言入門經典  範例:迴圈讀取檔案內容 >> << 範例:迴圈讀取檔案內容  

|逐字元讀取 13.4 檔案讀取

13.4.1 讀取單一字元

Page 15: | 13  檔案資料讀寫

C 語言入門經典2

1

 範例:讀取指定數量字元的檔案內容 >> << 逐字元讀取  

|範例:迴圈讀取檔案內容 13.4 檔案讀取

13.4.1 讀取單一字元

printf("%d,",c) ;

…,32,76,85,67,75,-1

Page 16: | 13  檔案資料讀寫

C 語言入門經典

3

2

1

  printf() >> << 範例:迴圈讀取檔案內容  

|範例:讀取指定數量字元的檔案內容 13.4 檔案讀取

13.4.2 讀取字串

Page 17: | 13  檔案資料讀寫

C 語言入門經典  範例:寫入單一字元 >> << 範例:讀取指定數量字元的檔案內容  

| printf()13.5 檔案寫入

13.5.1 寫入單一字元

int putc(int c, FILE *fp);

• 第 1 個引數為寫入檔案的字元• 第 2 個引數為寫入檔案的位址指標• 回傳寫入的字元,如果寫入失敗,則回傳 EOF 。

Page 18: | 13  檔案資料讀寫

C 語言入門經典

5

4

3

2

1

 範例:寫入單一字元 >> << printf()   

6

7

8

9

10

11

12

|範例:寫入單一字元 13.5 檔案寫入

13.5.1 寫入單一字元

Page 19: | 13  檔案資料讀寫

C 語言入門經典2

1

 範例:寫入單一字元 >> << 範例:寫入單一字元  

|範例:寫入單一字元 13.5 檔案寫入

13.5.1 寫入單一字元

Page 20: | 13  檔案資料讀寫

C 語言入門經典

3

2

1

 範例:寫入字元陣列 >> << 範例:寫入單一字元  

|範例:寫入單一字元 13.5 檔案寫入

13.5.1 寫入單一字元

FILE *of = fopen("C:\\hello.txt","a") ;

4

Page 21: | 13  檔案資料讀寫

C 語言入門經典

3

2

1

  fputs() >> << 範例:寫入單一字元  

|範例:寫入字元陣列 13.5 檔案寫入

13.5.1 寫入單一字元

Page 22: | 13  檔案資料讀寫

C 語言入門經典  範例:寫入字串 >> << 範例:寫入字元陣列  

| fputs()

int fputs(const char *s,FILE * fp);

• 第 1 個參數是字串,它會被寫入 fp 指標位址所指向的檔案• 寫入的動作發生失敗,則會回傳 EOF

13.5 檔案寫入

13.5.2 寫入字串

Page 23: | 13  檔案資料讀寫

C 語言入門經典

3

2

1

 範例:檔案複製 >> << fputs()   

|範例:寫入字串 13.5 檔案寫入

13.5.2 寫入字串

Page 24: | 13  檔案資料讀寫

C 語言入門經典

4

3

2

1

 檔案關閉與緩衝區 >> << 範例:寫入字串  

|範例:檔案複製 13.6 複製檔案

GOOD NIGHT AND GOOD LUCK

Page 25: | 13  檔案資料讀寫

C 語言入門經典  無緩衝區讀寫 >> << 範例:檔案複製  

|檔案關閉與緩衝區/* c = fclose(of) ; */• 程式在寫入檔案完成之後,不會自動關閉檔案• 指定的字元並沒有寫入檔案

13.7 緩衝區

Page 26: | 13  檔案資料讀寫

C 語言入門經典   open() >> << 檔案關閉與緩衝區  

|無緩衝區讀寫 13.8 無緩衝區資料讀寫

13.8.1 無緩衝區檔案讀寫函數

Page 27: | 13  檔案資料讀寫

C 語言入門經典

3

2

1

 開啟常數合併 >> << 無緩衝區讀寫  

| open()13.8 無緩衝區資料讀寫

13.8.2 開啟與關閉檔案

int open(const char *fpath,int openm [,int rwm]) ;

• 第 1 個參數為所要開啟的檔案• 第 2 個參數是開啟的模式

• 第 3 個參數則是檔案的存取屬性,這個參數是選擇性的,只有在第 2 個參數是特定值情形下才有效果

Page 28: | 13  檔案資料讀寫

C 語言入門經典  範例:開啟檔案 >> << open()   

|開啟常數合併

O_WRONLY | O_CREAT | O_APPEND

13.8 無緩衝區資料讀寫

13.8.2 開啟與關閉檔案

Page 29: | 13  檔案資料讀寫

C 語言入門經典

3

2

1

  close() >> << 開啟常數合併  

|範例:開啟檔案 13.8 無緩衝區資料讀寫

13.8.2 開啟與關閉檔案

Page 30: | 13  檔案資料讀寫

C 語言入門經典  範例:開啟與關閉檔案 >> << 開啟檔案  

| close()13.8 無緩衝區資料讀寫

13.8.2 開啟與關閉檔案

int close(int handle) ;

• 參數 handle 是所要關閉的檔案• 也就是成功開啟檔案時所回傳的值

Page 31: | 13  檔案資料讀寫

C 語言入門經典

5

4

3

2

1

  read() 與 write() >> << close()   

|範例:開啟與關閉檔案 13.8 無緩衝區資料讀寫

13.8.2 開啟與關閉檔案

開啟檔案代號: 3檔案順利關閉

Page 32: | 13  檔案資料讀寫

C 語言入門經典  範例:開啟複製 >> << 範例:開啟與關閉檔案  

| read() 與 write()13.8 無緩衝區資料讀寫

13.8.3 讀寫檔案

int read(int handle,char *buf,unsigned int count);

int write(int handle,char *buf, unsigned int count);

• 第 1 個參數 handle 為成功開啟檔案之後所回傳的檔案編號• 第 2 個參數 buf 儲存所讀取的資料• 第 3 個參數為所要讀取的位元組數目• 回傳值如果是 -1 表示資料讀取失敗,否則表示 read() 實際讀取的

位元組數目

• 第 1 個參數如上述,在這裡是指所要寫入的目標檔• 案,接下來的 buf 則是要寫入檔案的內容• 第 3 個參數則是所要寫入的位元組數目,回傳值則是實際寫入的位

元組,如果是 -1 ,表示寫入失敗

Page 33: | 13  檔案資料讀寫

C 語言入門經典   fread() 與 fwrite() >> << read() 與 write()   

|範例:開啟複製 13.8 無緩衝區資料讀寫

13.8.3 讀寫檔案

Page 34: | 13  檔案資料讀寫

C 語言入門經典   fopen() 與 fwrite() >> << 範例:開啟複製  

| fread() 與 fwrite()13.9 二進位格式檔案讀寫

13.9.1 fread() 與 fwrite()

Page 35: | 13  檔案資料讀寫

C 語言入門經典  範例:寫入二進位格式檔案 >> << fread() 與 fwrite()   

FILE *of = fopen("hellobin.bin","rb") ;

size_t fwrite(const void *pt,size_t size, size_t nmemb,FILE *fp);

| fopen() 與 fwrite()13.9 二進位格式檔案讀寫

13.9.1 fread() 與 fwrite()

• 第 2 個參數指定了 rb ,因此會以二進位格式開啟 hellobin.bin ,以支援檔案讀取作業。

• 第 1 個參數 pt 是要寫入檔案的資料位址指標• 第 2 個參數 size 為每一次所要寫入的資料單位• 第 3 個參數則是可能讀取的最大值• 最後一個參數 fp 為資料讀取的來源檔案• 回傳值代表成功寫入的元素數量,這個值會與第 3 個參數相同,除非• 遇到寫入的錯誤。

Page 36: | 13  檔案資料讀寫

C 語言入門經典

3

2

1

  fread() 與 fwite() >> << fopen() 與 fwrite()   

|範例:寫入二進位格式檔

總共寫入 3 個 int4

13.9 二進位格式檔案讀寫

13.9.1 fread() 與 fwrite()

Page 37: | 13  檔案資料讀寫

C 語言入門經典  範例:讀取二進位格式檔 >> << 範例:寫入二進位格式檔  

13.9 二進位格式檔案讀寫

13.9.1 fread() 與 fwrite()

int x = 100 ;fwrite(&x,sizeof(int),1,of) ;

• 寫入一般型態:| fread() 與 fwrite()

• 第 1 行是一個 int 型態的整數值• 第 2 行將其寫入指定的目標檔案,其中的第一個參數必須指定為 &x 。size_t fread(void * restrict pt,

size_t size, size_t nmemb,FILE * restrict fp);

• 執行檔案的讀取動作,回傳值代表成功讀取的元素數量

Page 38: | 13  檔案資料讀寫

C 語言入門經典

5

4

3

2

1

  open() >> << fread() 與 fwrite()   

6

7

|範例:讀取二進位格式檔 13.9 二進位格式檔案讀寫

13.9.1 fread() 與 fwrite()

總共讀取 3 個 int100200300

Page 39: | 13  檔案資料讀寫

C 語言入門經典  範例:二進位檔案讀寫 >> << 範例:讀取二進位格式檔  

| open()

open(filepath,O_WRONLY|O_CREAT|O_BINARY,S_IWRITE) ;

13.9 二進位格式檔案讀寫

13.9.2 無緩衝區的檔案讀寫

• 第 2 個參數指定了 O_BINARY ,如此一來就會以二進位格式的方式讀寫檔案。

Page 40: | 13  檔案資料讀寫

C 語言入門經典

4

3

2

1

 | << open()   

|範例:二維位檔案讀寫

寫入位元組: 12讀取位元組: 12讀取內容:444666888

13.9 二進位格式檔案讀寫

13.9.2 無緩衝區的檔案讀寫