1 / 30

第 10 章 檔案與資料夾處理

第 10 章 檔案與資料夾處理. 10-1 C 語言的檔案輸入與輸出 10-2 文字檔案的讀寫 10-3 二進位檔案的讀寫 10-4 檔案與資料夾處理. 10-1 C 語言的檔案輸入與輸出 - 說明. 「檔案」( Files )是儲存在電腦周邊裝置的位元組資料集合,通常是儲存在軟式或硬式磁碟機的資料,程式可以將輸出的資料儲存在檔案中保存,或是將檔案視為輸入資料讀取檔案內容,輸出到控制台或印表機。

zelda-page
Download Presentation

第 10 章 檔案與資料夾處理

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第10章 檔案與資料夾處理 • 10-1 C語言的檔案輸入與輸出 • 10-2 文字檔案的讀寫 • 10-3 二進位檔案的讀寫 • 10-4 檔案與資料夾處理

  2. 10-1 C語言的檔案輸入與輸出-說明 • 「檔案」(Files)是儲存在電腦周邊裝置的位元組資料集合,通常是儲存在軟式或硬式磁碟機的資料,程式可以將輸出的資料儲存在檔案中保存,或是將檔案視為輸入資料讀取檔案內容,輸出到控制台或印表機。 • 在檔案儲存的位元組資料可能被解譯成字元、數值、整數、字串或資料庫的記錄,取決於C程式開啟的檔案存取類型。C語言標準函式庫的「檔案輸入與輸出」(File Input/Output,簡稱File I/O)函數可以處理二種檔案類型:文字和二進位檔案。

  3. 10-1 C語言的檔案輸入與輸出-文字檔案 • 文字檔案儲存的是字元資料,文字檔案視為一種「文字串流」(Text Stream),串流可以想像成水龍頭流出的是一個個字元,換句話說,處理文字檔案只能向前一個個循序處理字元,也稱為「循序檔案」(Squential Files),如同水往低處流,並不能回頭處理之前處理過的字元。 • 文字檔案擁有讀取(Input)、寫入(Output)和新增(Append)三種操作,可以將字元資料寫入檔案、寫入檔尾與讀取文字檔案的內容,例如:Windows記錄檔或使用【記事本】建立的是一種文字檔案。

  4. 10-1 C語言的檔案輸入與輸出-二進位檔案 • 以作業系統的角度來說,儲存在磁碟機的二進位(Binary)檔和文字檔案並沒有什麼不同,C語言標準函式庫存取的二進位檔是指沒有處理過的「位元組」(Bytes)資料,即「二進位串流」(Binary Stream),其特性是寫入和讀出檔案的資料完全相同。 • 當檔案以二進位檔案方式開啟,資料並不會作任何格式轉換(主要是指處理換行和檔案的結束字元),讀取的是位元組資料,不過在C程式可以將它轉換成字元資料,換句話說,讀取的資料是字元或位元組,全憑程式如何解釋它。

  5. 10-2 文字檔案的讀寫 • 10-2-1 開啟與關閉文字檔案 • 10-2-2 讀寫字串到文字檔案 • 10-2-3 讀寫字元到文字檔案 • 10-2-4 格式化讀寫文字檔案

  6. 10-2-1 開啟與關閉文字檔案-函數說明 • 在C語言開啟和關閉檔案,都是使用<stdio.h>標頭檔宣告的FILE檔案指標來識別開啟的檔案(因為在同一個C程式可以開啟多個檔案),相關函數說明如下表所示:

  7. 10-2-1 開啟與關閉文字檔案-範例 • 在程式只需宣告FILE指標變數fp,就可以使用fopen()函數開啟檔案,如下所示: FILE *fp; fp = fopen("filename", "w"); • 上述函數的第1個參數是檔案名稱或檔案的完整路徑(請注意!路徑「\」符號在某些作業系統需要使用逸出字元「\\」,例如:“C:\\C++\\test.c"),第2個參數是檔案開啟模式字串。

  8. 10-2-1 開啟與關閉文字檔案-開啟模式 • 文字檔案支援的開啟模式,如下表所示:

  9. 10-2-1 開啟與關閉文字檔案-檢查是否開啟成功 • 如果fopen()函數傳回NULL表示檔案開啟失敗,可以使用if條件檢查檔案指標,如下所示: if ( fp == NULL ) { printf("錯誤: 檔案開啟失敗....\n"); exit(1); } • 上述if條件檢查檔案指標變數fp,如果是NULL就表示檔案開啟錯誤,所以顯示錯誤訊息,接著使用<stdlib.h>標頭檔的exit()函數強迫結束程式執行,exit()函數的參數是傳給作業系統,如為非零值,表示程式執行發生錯誤。

  10. 10-2-1 開啟與關閉文字檔案-關閉檔案 • 最後在執行完檔案操作後,執行fclose()函數關閉檔案,如下所示: fclose(fp); • 上述函數的參數就是欲關閉檔案的FILE指標變數。

  11. 10-2-2 讀寫字串到文字檔案-函數說明 • 在C程式使用fopen()函數成功開啟檔案後,就可以執行檔案處理函數寫入或讀取文字檔案內容,從檔案讀寫字串的相關函數說明,如下表所示:

  12. 10-2-2 讀寫字串到文字檔案-範例 • 在C程式的文字檔案讀寫,可以使用fputs()函數寫入字串到文字檔案,如下所示: fputs(line , fp); • 上述函數將字串line寫入檔案指標fp。讀取檔案內容可以使用fgets()函數配合while迴圈讀取整個檔案內容,如下所示: while( fgets(line, 50 ,fp) != NULL ) { } • 上述while迴圈以一次一行的方式讀取檔案,每一行最多為50-1即49個字元,直到fgets()函數傳回NULL為止,也就是到達檔尾。

  13. 10-2-3 讀寫字元到文字檔案-函數說明 • 類似第4章的putchar()和getchar()字元輸出和輸入函數,檔案I/O也提供讀寫字元的putc()和getc()函數,如下表所示:

  14. 10-2-3 讀寫字元到文字檔案-範例 • 在C程式寫入字元到文字檔案可以使用putc()函數,如下所示: putc(line[i][j] , fp); • 上述程式碼將二維字元陣列的line[i][j]元素寫入檔案fp。如果使用getc()函數讀取整個檔案內容,一樣是配合while迴圈讀取,如下所示: while ((c = getc(fp))!= EOF ) putchar(c); • 上述while迴圈以一次一個字元的方式讀取檔案,直到getc()函數傳回EOF為止,也就是到達檔尾。

  15. 10-2-4 格式化讀寫文字檔案-函數說明 • 在第4章的printf()和scanf()格式化輸出和輸入函數,檔案I/O也有對應的fprintf()和fscanf()格式化輸出輸入函數,如下表所示:

  16. 10-2-4 格式化讀寫文字檔案-範例 • fprintf()格式化輸出函數可以使用格式字串來編排寫入檔案的字串內容,如下所示: fprintf(fp, “%d=> %s\n”, 1, line); • 上述程式碼是將格式字串輸入的內容寫入檔案fp,可以看到是組合整數常數和字串line的字串內容。同樣的,我們可以使用fscanf()函數配合while迴圈讀取整個檔案內容,如下所示: while ( fscanf(fp,"%s", line) != EOF ) printf("%s\n", line); • 上述while迴圈一次讀取一個格式字串的資料,以此例是字串,直到傳回EOF為止,也就是到達檔尾。

  17. 10-3 二進位檔案的讀寫 • 10-3-1 寫入記錄到二進位檔案 • 10-3-2 循序讀取檔案的記錄 • 10-3-3 隨機存取記錄資料

  18. 10-3 二進位檔案的讀寫-說明 • 二進位檔案讀寫除了可以使用文字檔案的循序方式存取,還可以使用隨機方式,檔案是使用記錄為單位來進行存取,能夠隨機存取任一筆記錄或更改指定記錄的資料。 • C語言的二進位檔案一樣是使用fopen()函數開啟和fclose()函數關閉檔案,只是使用不同的開啟模式字串,在程式宣告FILE指標變數fp後,就可以開啟指定的二進位檔案,如下所示: FILE *fp; fp = fopen("filename", "wb");

  19. 10-3 二進位檔案的讀寫-開啟模式 • 二進位檔案支援的開啟模式,如下表所示:

  20. 10-3-1 寫入記錄到二進位檔案-結構宣告 • 隨機存取是以記錄為存取單位,在建立二進位檔案的隨機存取前,C程式需要宣告結構來儲存記錄資料,例如:學生資料的record結構,如下所示: struct record { char name[20]; int age; float score; }; typedef struct record student; • 上述結構擁有姓名name、年齡age和成績score的成員變數,為了方便宣告,筆者建立新型態student。

  21. 10-3-1 寫入記錄到二進位檔案-函數說明 • 在使用fopen()函數開啟二進位檔案後,就可以呼叫fwrite()函數寫入結構的記錄資料,相關函數說明,如下表所示:

  22. 10-3-1 寫入記錄到二進位檔案-範例 • 以本節的student結構為例,如下所示: student temp; ……… fwrite(&temp, sizeof(temp), 1, fp); • 以此例是寫入一筆結構temp到檔案fp。 • 雖然檔案讀寫錯誤很少發生,不過為了避免磁碟已滿等讀寫錯誤,在讀寫操作後,可以使用ferror()函數檢查是否讀寫錯誤,如下所示: if ( ferror(fp) ) printf("錯誤: 寫入錯誤!\n"); else printf("已經寫入3筆記錄!\n");

  23. 10-3-2 循序讀取檔案的記錄-相關函數說明 • 當C程式在二進位檔案呼叫fwrite()函數寫入記錄資料後,我們可以使用fread()函數配合迴圈將一筆筆記錄循序讀出,相關函數說明,如下表所示:

  24. 10-3-2 循序讀取檔案的記錄-範例 • 在二進位檔案可以使用feof()函數檢查是否讀到檔尾,只需配合while迴圈即可讀取檔案的所有記錄,如下所示: while ( !feof(fp) ) { if ( fread(&std, sizeof(std), 1, fp) ) { } } • 上述while迴圈使用fread()函數讀取檔案直到feof()函數傳回非零值,也就是到達檔尾。

  25. 10-3-3 隨機存取記錄資料-相關函數說明 • C程式只需先呼叫fseek()函數找到指定記錄的檔案位置,即可隨機存取指定的記錄資料,相關函數說明,如下表所示:

  26. 10-3-3 隨機存取記錄資料-範例 • 在本節程式範例的fseek()函數中,offset參數是位移量,可以使用記錄數和結構大小計算而得,如下所示: fseek(fp, rec*sizeof(std), SEEK_SET); • 程式碼是從SEEK_SET位置的檔案開頭開始,位移量是rec*sizeof(std)位元組數,rec是記錄編號從0開始,使用sizeof運算子計算結構大小,origin參數值有三種,如下所示: • SEEK_SET:從檔案開頭。 • SEEK_CUR:從檔案現在的位置。 • SEEK_END:從檔案結尾。

  27. 10-4 檔案與資料夾處理 • 10-4-1 更改檔名與刪除檔案 • 10-4-2 建立、刪除和切換目錄 • 10-4-3 複製檔案

  28. 10-4-1 更改檔名與刪除檔案 • 在C語言標準函式庫<stdio.h>標頭檔提供更改檔案名稱和刪除檔案的函數,其說明如下表所示:

  29. 10-4-2 建立、刪除和切換目錄 • 在<dir.h>標頭檔(微軟Visual C++ 2005語言是使用<direct.h>標頭檔)提供取得工作路徑、切換、建立和刪除資料夾的函數,如下表所示:

  30. 10-4-3 複製檔案 • 在C語言的標準函式庫並沒有提供檔案複製函數,不過只需使用本章前的檔案讀寫函數,在開啟2個檔案指標sfp和dfp後,即可使用while迴圈複製檔案內容,如下所示: while ( (c = getc(sfp)) != EOF ) putc(c, dfp); • 上述while迴圈從檔案指標sfp呼叫getc()函數讀取一個個字元,然後呼叫putc()函數寫入檔案指標dfp,換句話說,檔案指標sfp的檔案內容就會複製到dfp。

More Related