第10章 檔案與資料夾處理

30
10 10 第 第第第第第第第第 第 第第第第第第第第 10-1 10-1 第第第第第 第第第第第 10-2 10-2 第第第第第第第 第第第第第第第 10-3 10-3 第第第第第第第第 第第第第第第第第 10-4 10-4 第第第第第第第第 第第第第第第第第

description

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

Transcript of 第10章 檔案與資料夾處理

Page 1: 第10章 檔案與資料夾處理

第第 1010 章 檔案與資料夾處理章 檔案與資料夾處理 10-1 10-1 檔案的基礎檔案的基礎 10-2 10-2 文字檔案的讀寫文字檔案的讀寫 10-3 10-3 二進位檔案的讀寫二進位檔案的讀寫 10-4 10-4 檔案與資料夾處理檔案與資料夾處理

Page 2: 第10章 檔案與資料夾處理

10-1 10-1 檔案的基礎檔案的基礎 -- 說明說明 「檔案」(「檔案」( FilesFiles ))是儲存在電腦周邊裝置的位是儲存在電腦周邊裝置的位元組資料集合,通常是儲存在軟硬磁碟機的資料,元組資料集合,通常是儲存在軟硬磁碟機的資料,程式可以將輸出的資料儲存在檔案中保存,或是程式可以將輸出的資料儲存在檔案中保存,或是將檔案視為輸入資料讀取檔案內容,檔案的位元將檔案視為輸入資料讀取檔案內容,檔案的位元組資料可能被解譯成字元、數值、整數、字串或組資料可能被解譯成字元、數值、整數、字串或資料庫的記錄,取決於程式開啟的檔案存取類型。資料庫的記錄,取決於程式開啟的檔案存取類型。 CC 語 言 標 準 函 式 庫 的語 言 標 準 函 式 庫 的 「 檔 案「 檔 案 I/OI/O 」(」( File File

Input/OutputInput/Output ))函數可以處理二種檔案類型:文函數可以處理二種檔案類型:文字和二進位檔案。字和二進位檔案。

Page 3: 第10章 檔案與資料夾處理

10-1 10-1 檔案的基礎檔案的基礎 -- 文字檔案文字檔案(( Text FilesText Files))

文字檔案儲存的是字元資料,文字檔案視為一種文字檔案儲存的是字元資料,文字檔案視為一種「文字串流」(「文字串流」( Text StreamText Stream)),,串流可以想像串流可以想像成水龍頭流出的是一個個字元,也就是說處理文成水龍頭流出的是一個個字元,也就是說處理文字檔案只能向前一個個循序處理字元,也稱為字檔案只能向前一個個循序處理字元,也稱為「循序檔案」(「循序檔案」( Squential FilesSquential Files)),,如同水往如同水往低處流,並不能回頭處理之前處理過的字元。低處流,並不能回頭處理之前處理過的字元。 文字檔案的處理就是讀取(文字檔案的處理就是讀取( InputInput)、)、寫入寫入(( OutputOutput ))和新增(和新增( AppendAppend ))三種方式,將三種方式,將字元資料寫入檔案與讀取文字檔案的內容。字元資料寫入檔案與讀取文字檔案的內容。

Page 4: 第10章 檔案與資料夾處理

10-1 10-1 檔案的基礎檔案的基礎 -- 二進位檔案二進位檔案(( Binary FilesBinary Files))

儲存在磁碟機的二進位(儲存在磁碟機的二進位( BinaryBinary ))檔和文字檔案並沒檔和文字檔案並沒有什麼不同,有什麼不同, CC 語言標準函式庫存取的二進位檔是指語言標準函式庫存取的二進位檔是指沒有處理過的沒有處理過的「位元組」(「位元組」( BytesBytes ))資料資料,這種,這種「二「二進位串流」(進位串流」( Binary StreamBinary Stream ))的特性是寫入和讀出的特性是寫入和讀出檔案的資料完全相同。檔案的資料完全相同。 二進位檔案可以依需求以循序或二進位檔案可以依需求以循序或「隨機存取」「隨機存取」(( Random AccessRandom Access ))方式進行處理,隨機處理可以方式進行處理,隨機處理可以將檔案視為一個儲存在記憶體的陣列或結構陣列,只將檔案視為一個儲存在記憶體的陣列或結構陣列,只需移動需移動「檔案指標」(「檔案指標」( File PointerFile Pointer ))到存取的位置,到存取的位置,就可以存取資料,如同在陣列使用索引存取陣列元素。就可以存取資料,如同在陣列使用索引存取陣列元素。

Page 5: 第10章 檔案與資料夾處理

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

Page 6: 第10章 檔案與資料夾處理

10-2-1 10-2-1 開啟與關閉文字檔案開啟與關閉文字檔案 -- 函函數數函數 說明

FILE *fopen(char *filename, char *mode) 以 mode 參數的模式開啟參數 filename

的檔案名稱或完整路徑,如果開啟成

功,傳回檔案指標,否則傳回 NULL

int fclose(FILE *fp) 關閉 FILE 指標的檔案,成功傳回 0,

失敗傳回 EOF

Page 7: 第10章 檔案與資料夾處理

10-2-1 10-2-1 開啟與關閉文字檔案開啟與關閉文字檔案 -- 範範例例 在程式只需宣告在程式只需宣告 FILEFILE 指標變數指標變數 fpfp ,,就可就可以使用以使用 fopen()fopen() 函數開啟檔案,如下所示:函數開啟檔案,如下所示:

FILE *fp;FILE *fp;fp = fopen("filename", "w");fp = fopen("filename", "w");

函數的第函數的第 11 個參數是檔案名稱或檔案的完個參數是檔案名稱或檔案的完整路徑,第整路徑,第 22 個參數是檔案開啟模式字串,個參數是檔案開啟模式字串,文字檔案支援的開啟模式文字檔案支援的開啟模式。。

Page 8: 第10章 檔案與資料夾處理

10-2-1 10-2-1 開啟與關閉文字檔案開啟與關閉文字檔案 -- 開開啟模式啟模式模式字串 當開啟檔案已經存在 當開啟檔案不存在

r 開啟一個唯讀的文字檔案 傳回 NULL

w 清除檔案內容後寫入 建立寫入的文字檔案

a 開啟檔案從檔尾後開始寫入 建立寫入的文字檔案

r+ 開啟一個讀寫的文字檔案 傳回 NULL

w+ 清除檔案內容後讀寫內容 建立讀寫的文字檔案

a+ 開啟檔案從檔尾後開始讀寫 建立讀寫的文字檔案

Page 9: 第10章 檔案與資料夾處理

10-2-1 10-2-1 開啟與關閉文字檔案開啟與關閉文字檔案 -- 檢檢查檔案是否開啟查檔案是否開啟 fopen()fopen() 函數傳回函數傳回 NULLNULL 表示檔案開啟失敗,可表示檔案開啟失敗,可以使用以使用 ifif 條件檢查檔案指標,如下所示:條件檢查檔案指標,如下所示:

if ( fp == NULL ) {if ( fp == NULL ) { printf("printf(" 檔案開啟失敗檔案開啟失敗 ....\....\n");n"); exit(1);exit(1);}}

最後在執行完檔案操作後,請執行最後在執行完檔案操作後,請執行 fclose()fclose() 函數函數關閉檔案,如下所示:關閉檔案,如下所示:fclose(fp);fclose(fp);

Page 10: 第10章 檔案與資料夾處理

10-2-2 10-2-2 讀寫字串到文字檔案讀寫字串到文字檔案 -- 函函數數函數 說明

int fputs(char *str, FILE *fp) 將參數 str 指標的字串寫入檔案 fp,寫

入成功傳回非負整數,否則傳回 EOF

char *fgets(char *str, int num, FILE *fp) 讀取參數檔案 fp 的內容到字串指標str,一共讀取 num-1 個字元,讀取成

功,傳回 str指標,否則傳回 NULL

Page 11: 第10章 檔案與資料夾處理

10-2-2 10-2-2 讀寫字串到文字檔案讀寫字串到文字檔案 -- 範範例例 使用使用 fgets()fgets() 函數讀取整個檔案內容,可以函數讀取整個檔案內容,可以配合配合 whilewhile 迴圈來讀取,如下所示:迴圈來讀取,如下所示:

while( fgets(line, 50 ,fp) != NULL )while( fgets(line, 50 ,fp) != NULL ){ }{ }

whilewhile 迴圈以一次一行的方式讀取檔案,每迴圈以一次一行的方式讀取檔案,每一行最多為一行最多為 50-150-1 即即 4949 個字元,直到個字元,直到fgets()fgets() 函數傳回函數傳回 NULLNULL 為止,也就是到達為止,也就是到達檔尾。檔尾。

Page 12: 第10章 檔案與資料夾處理

10-2-3 10-2-3 讀寫字元到文字檔案讀寫字元到文字檔案 -- 函函數數函數 說明

int putc(int ch, FILE *fp) 將參數 ch 字元寫入檔案 fp,寫入成功傳回字元ch,否則傳回 EOF

char getc(FILE *fp) 讀取參數檔案 fp 的內容,一次一個字元,讀取成

功,傳回讀取的字元,否則傳回 EOF

Page 13: 第10章 檔案與資料夾處理

10-2-3 10-2-3 讀寫字元到文字檔案讀寫字元到文字檔案 -- 範範例例 使用使用 getc()getc() 函數讀取整個檔案內容,一樣函數讀取整個檔案內容,一樣可以配合可以配合 whilewhile 迴圈來讀取,如下所示:迴圈來讀取,如下所示:

while ((c = getc(fp))!= EOF )while ((c = getc(fp))!= EOF ) putchar(c);putchar(c);

whilewhile 迴圈以一次一個字元的方式讀取檔案,迴圈以一次一個字元的方式讀取檔案,直到直到 getc()getc() 函數傳回函數傳回 EOFEOF 為止,也就是到為止,也就是到達檔尾。達檔尾。

Page 14: 第10章 檔案與資料夾處理

10-2-4 10-2-4 格式化讀寫文字檔案格式化讀寫文字檔案 -- 函函數數函數 說明

int fprintf(FILE *fp, char *control, …) 與 printf()函數相同,只是輸出到檔案fp。如果寫入成功,傳回輸出的字

元,否則傳回 EOF

int fscanf(FILE *fp, char *control, …) 與 scanf()函數相同,只是從檔案 fp 讀

取,如果讀取成功,傳回讀取的字

元,否則傳回 EOF

Page 15: 第10章 檔案與資料夾處理

10-2-4 10-2-4 格式化讀寫文字檔案格式化讀寫文字檔案 -- 範範例例 使用使用 fscanf()fscanf() 函數配合函數配合 whilewhile 迴圈就可以迴圈就可以讀取整個檔案的內容,如下所示:讀取整個檔案的內容,如下所示:

while ( fscanf(fp,"%s", line) != EOF )while ( fscanf(fp,"%s", line) != EOF ) printf("%s\n", line);printf("%s\n", line);

whilewhile 迴圈以一次讀取一個格式字串的資料,迴圈以一次讀取一個格式字串的資料,以此例是字串,直到傳回以此例是字串,直到傳回 EOFEOF 為止,也就為止,也就是到達檔尾。是到達檔尾。

Page 16: 第10章 檔案與資料夾處理

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

Page 17: 第10章 檔案與資料夾處理

10-3 10-3 二進位檔案的讀寫二進位檔案的讀寫 -- 說明說明 二進位檔案讀寫除了可以使用文字檔案的二進位檔案讀寫除了可以使用文字檔案的循序方式存取,還可以使用隨機方式,以循序方式存取,還可以使用隨機方式,以記錄為單位進行存取,能夠隨機存取任一記錄為單位進行存取,能夠隨機存取任一筆記錄或更改指定記錄的資料。筆記錄或更改指定記錄的資料。

Page 18: 第10章 檔案與資料夾處理

10-3 10-3 二進位檔案的讀寫二進位檔案的讀寫 -- 開啟開啟 CC 語言的二進位檔案也是使用語言的二進位檔案也是使用 fopen()fopen() 函數開啟函數開啟和和 fclose()fclose() 函數關閉檔案,只是使用不同的開啟函數關閉檔案,只是使用不同的開啟模式字串,在程式宣告模式字串,在程式宣告 FILEFILE 指標變數指標變數 fpfp 後,就後,就可以開啟指定的檔案,如下所示:可以開啟指定的檔案,如下所示:FILE *fp;FILE *fp;fp = fopen("filename", "wb");fp = fopen("filename", "wb");

函數開啟檔案函數開啟檔案 filenamefilename ,,第第 22 個參數的檔案開個參數的檔案開啟模式多了字元啟模式多了字元 ''b'b' ,,表示開啟的是二進位檔案。表示開啟的是二進位檔案。

Page 19: 第10章 檔案與資料夾處理

10-3 10-3 二進位檔案的讀寫二進位檔案的讀寫 -- 開啟模開啟模式式模式字串 當開啟檔案已經存在 當開啟檔案不存在

rb 開啟一個唯讀的二進位檔案 傳回 NULL

wb 清除檔案內容後寫入 建立寫入的二進位檔案

r+b 開啟一個讀寫的二進位檔案 傳回 NULL

w+b 清除檔案內容後讀寫內容 建立讀寫的二進位檔案

Page 20: 第10章 檔案與資料夾處理

10-3-1 10-3-1 寫入記錄到二進位檔案寫入記錄到二進位檔案 --結構結構 隨機存取是以記錄為存取單位,在建立二進隨機存取是以記錄為存取單位,在建立二進位檔案的隨機存取前,位檔案的隨機存取前, CC 程式需要宣告結構程式需要宣告結構來儲存資料,例如:學生資料的來儲存資料,例如:學生資料的 recordrecord 結構,結構,如下所示:如下所示:

struct record {struct record { char name[20];char name[20]; int age;int age; float score;float score;};};typedef struct record student;typedef struct record student;

Page 21: 第10章 檔案與資料夾處理

10-3-1 10-3-1 寫入記錄到二進位檔案寫入記錄到二進位檔案 --函數函數函數 說明

size_t fwrite(void *ptr, size_t size,

size_t n, FILE *fp)從參數 ptr 指標的位址起算,將大小 size

的 n 筆記錄,即 n*size 位元組寫入檔案fp,寫入成功傳回寫入的記錄數 n,如果

小於 n表示有錯誤產生

int ferror(FILE *fp) 傳回最後檔案讀寫操作的狀態,如果有錯

誤傳回非零值,否則傳回 0

Page 22: 第10章 檔案與資料夾處理

10-3-1 10-3-1 寫入記錄到二進位檔案寫入記錄到二進位檔案 --範例範例 以以 studentstudent 結構為例,如下所示:結構為例,如下所示:

student temp;student temp;………………fwrite(&temp, sizeof(temp), 1, fp);fwrite(&temp, sizeof(temp), 1, fp);

程式碼建立結構變數程式碼建立結構變數 temptemp ,,在指定成員在指定成員變數的值後,呼叫變數的值後,呼叫 fwrite()fwrite() 函數寫入此結函數寫入此結構,構, &&temptemp 取得結構位址,取得結構位址, sizeofsizeof 運算運算子計算結構大小,以此例就是寫入一筆結子計算結構大小,以此例就是寫入一筆結構構 temptemp 到檔案到檔案 fpfp。。

Page 23: 第10章 檔案與資料夾處理

10-3-2 10-3-2 循序讀取檔案的記錄循序讀取檔案的記錄 -- 函函數數函數 說明

size_t fread(void *ptr, size_t size, size_t

n, FILE *fp)在檔案 fp 從參數 ptr 指標的位址起算,

讀取大小 size的 n筆記錄,即 n*size位

元組,讀取成功傳回讀取的記錄數 n,

如果小於 n表示有錯誤產生

int feof(File *fp) 檢查是否讀到檔案結束,如果是,傳回

非零值,否則傳回 0

Page 24: 第10章 檔案與資料夾處理

10-3-2 10-3-2 循序讀取檔案的記錄循序讀取檔案的記錄 -- 使使用用 二進位檔案可能儲存多筆記錄,二進位檔案可能儲存多筆記錄, feof()feof() 函函數是用來檢查是否讀到檔尾,在配合數是用來檢查是否讀到檔尾,在配合 whilewhile迴圈後,就可以讀取檔案的所有記錄,如迴圈後,就可以讀取檔案的所有記錄,如下所示:下所示:

while ( !feof(fp) )while ( !feof(fp) ){ }{ }

whilewhile 迴圈讀取檔案直到迴圈讀取檔案直到 feof()feof() 函數傳回函數傳回非零值,也就是到達檔尾。非零值,也就是到達檔尾。

Page 25: 第10章 檔案與資料夾處理

10-3-3 10-3-3 隨機存取記錄資料隨機存取記錄資料 -- 函數函數函數 說明

int fseek(FILE *fp, long offset, int origin) 從參數的 origin 位置開始計算位移offset 後,將檔案 fp 的檔案指標移到此

位置,成功傳回 0,否則傳回非零值

int fflush(File *fp) 將緩衝區的資料寫入檔案,如果有錯誤

傳回 EOF

long ftell(File *fp) 傳回目前的檔案位置,如果有錯誤傳回

-1

Page 26: 第10章 檔案與資料夾處理

10-3-3 10-3-3 隨機存取記錄資料隨機存取記錄資料 -- 使用使用 fseek()fseek() 函數的函數的 offsetoffset 參數是位移量,可以使用記錄數參數是位移量,可以使用記錄數和結構大小計算而得,如下所示:和結構大小計算而得,如下所示:

fseek(fp, rec*sizeof(std), SEEK_SET);fseek(fp, rec*sizeof(std), SEEK_SET); 程式碼是從程式碼是從 SEEK_SETSEEK_SET 位置的檔案開頭開始,位移量位置的檔案開頭開始,位移量是是 rec*sizeof(std)rec*sizeof(std) 位元組數,其中位元組數,其中 recrec 是記錄編號從是記錄編號從00 開始,使用開始,使用 sizeofsizeof 運算子計算結構大小,即記錄尺運算子計算結構大小,即記錄尺寸,寸, originorigin 參數值有三種,如下:參數值有三種,如下:• SEEK_SETSEEK_SET::從檔案開頭。從檔案開頭。• SEEK_CURSEEK_CUR::從檔案現在的位置。從檔案現在的位置。• SEEK_ENDSEEK_END::從檔案結尾。從檔案結尾。

Page 27: 第10章 檔案與資料夾處理

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

Page 28: 第10章 檔案與資料夾處理

10-4-1 10-4-1 更改檔名與刪除檔案更改檔名與刪除檔案函數 說明

int remove (char *filename) 將參數的檔案名稱刪除,成功刪除傳

回 0,失敗傳回-1

int rename (char *oname, char *nname) 將參數 oname 的舊檔名改為 nname

的新檔名,成功傳回 0,失敗傳回-1

Page 29: 第10章 檔案與資料夾處理

10-4-2 10-4-2 建立、刪除和切換目錄建立、刪除和切換目錄函數 說明

char* getcwd (char *name, int len) 取得目前完整的工作路徑,路徑字串是存

入參數 name 字串指標的字元陣列,其大

小為 len 參數,成功取回工作路徑,傳回name指標,否則為 NULL

int chdir (char *path) 切換到參數的目錄路徑字串,成功傳回0,失敗傳回-1

int mkdir (char *path) 建立參數的目錄路徑字串,成功傳回 0,

失敗傳回-1

int rmdir (char *path) 刪除參數的目錄路徑字串,成功傳回 0,

失敗傳回-1

Page 30: 第10章 檔案與資料夾處理

10-4-3 10-4-3 複製檔案複製檔案 CC 語言的標準函式庫並沒有提供複製檔案的語言的標準函式庫並沒有提供複製檔案的函數,不過只需使用本章前說明的檔案讀函數,不過只需使用本章前說明的檔案讀寫函數,在開啟寫函數,在開啟 22 個檔案指標個檔案指標 sfpsfp和和 dfpdfp後,使用後,使用 whilewhile 迴圈就可以複製檔案內容,迴圈就可以複製檔案內容,如下所示:如下所示:

while ( (c = getc(sfp)) != EOF )while ( (c = getc(sfp)) != EOF ) putc(c, dfp);putc(c, dfp);