第 10 章 檔案與資料夾處理

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

Upload: zelda-page

Post on 02-Jan-2016

36 views

Category:

Documents


0 download

DESCRIPTION

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

TRANSCRIPT

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

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

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

10-1 C10-1 C 語言的檔案輸入與輸出語言的檔案輸入與輸出 --說明說明

「檔案」(「檔案」( FilesFiles )是儲存在電腦周邊裝置的位)是儲存在電腦周邊裝置的位元組資料集合,通常是儲存在軟式或硬式磁碟機元組資料集合,通常是儲存在軟式或硬式磁碟機的資料,程式可以將輸出的資料儲存在檔案中保的資料,程式可以將輸出的資料儲存在檔案中保存,或是將檔案視為輸入資料讀取檔案內容,輸存,或是將檔案視為輸入資料讀取檔案內容,輸出到控制台或印表機。出到控制台或印表機。

在檔案儲存的位元組資料可能被解譯成字元、數在檔案儲存的位元組資料可能被解譯成字元、數值、整數、字串或資料庫的記錄,取決於值、整數、字串或資料庫的記錄,取決於 CC 程式程式開啟的檔案存取類型。開啟的檔案存取類型。 CC 語言標準函式庫的「檔語言標準函式庫的「檔案輸入與輸出」(案輸入與輸出」( File Input/OutputFile Input/Output ,簡稱,簡稱File I/OFile I/O )函數可以處理二種檔案類型:文字和)函數可以處理二種檔案類型:文字和二進位檔案。二進位檔案。

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

10-1 C10-1 C 語言的檔案輸入與輸出語言的檔案輸入與輸出 --文字檔案文字檔案

文字檔案儲存的是字元資料,文字檔案視為一種文字檔案儲存的是字元資料,文字檔案視為一種「文字串流」(「文字串流」( Text StreamText Stream ),串流可以想像),串流可以想像成水龍頭流出的是一個個字元,換句話說,處理成水龍頭流出的是一個個字元,換句話說,處理文字檔案只能向前一個個循序處理字元,也稱為文字檔案只能向前一個個循序處理字元,也稱為「循序檔案」(「循序檔案」( Squential FilesSquential Files ),如同水往),如同水往低處流,並不能回頭處理之前處理過的字元。低處流,並不能回頭處理之前處理過的字元。

文字檔案擁有讀取(文字檔案擁有讀取( InputInput )、寫入()、寫入( OutpuOutputt )和新增()和新增( AppendAppend )三種操作,可以將字元)三種操作,可以將字元資料寫入檔案、寫入檔尾與讀取文字檔案的內容,資料寫入檔案、寫入檔尾與讀取文字檔案的內容,例如:例如: WindowsWindows 記錄檔或使用記錄檔或使用【【記事本記事本】】建立建立的是一種文字檔案。的是一種文字檔案。

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

10-1 C10-1 C 語言的檔案輸入與輸出語言的檔案輸入與輸出 --二進位檔案二進位檔案

以作業系統的角度來說,儲存在磁碟機的二進位以作業系統的角度來說,儲存在磁碟機的二進位(( BinaryBinary )檔和文字檔案並沒有什麼不同,)檔和文字檔案並沒有什麼不同, CC語言標準函式庫存取的二進位檔是指沒有處理過語言標準函式庫存取的二進位檔是指沒有處理過的「位元組」(的「位元組」( BytesBytes )資料,即「二進位串)資料,即「二進位串流」(流」( Binary StreamBinary Stream ),其特性是寫入和讀出),其特性是寫入和讀出檔案的資料完全相同。檔案的資料完全相同。

當檔案以二進位檔案方式開啟,資料並不會作任當檔案以二進位檔案方式開啟,資料並不會作任何格式轉換(主要是指處理換行和檔案的結束字何格式轉換(主要是指處理換行和檔案的結束字元),讀取的是位元組資料,不過在元),讀取的是位元組資料,不過在 CC 程式可以程式可以將它轉換成字元資料,換句話說,讀取的資料是將它轉換成字元資料,換句話說,讀取的資料是字元或位元組,全憑程式如何解釋它。字元或位元組,全憑程式如何解釋它。

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 開啟與關閉文字檔案開啟與關閉文字檔案 -- 函函數說明數說明

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

函數 說明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 個參數是檔案名稱或檔案個參數是檔案名稱或檔案

的完整路徑(請注意!路徑「的完整路徑(請注意!路徑「 \\ 」符號在某」符號在某些作業系統需要使用逸出字元「些作業系統需要使用逸出字元「 \\\\ 」,例」,例如:如:““ C:\\C++\\test.c"C:\\C++\\test.c" ),第),第 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);

}} 上述上述 ifif 條件檢查檔案指標變數條件檢查檔案指標變數 fpfp ,如果是,如果是 NULLNULL

就表示檔案開啟錯誤,所以顯示錯誤訊息,接著就表示檔案開啟錯誤,所以顯示錯誤訊息,接著使用使用 <stdlib.h><stdlib.h> 標頭檔的標頭檔的 exit()exit() 函數強迫結束函數強迫結束程式執行,程式執行, exit()exit() 函數的參數是傳給作業系統,函數的參數是傳給作業系統,如為非零值,表示程式執行發生錯誤。如為非零值,表示程式執行發生錯誤。

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

10-2-1 10-2-1 開啟與關閉文字檔案開啟與關閉文字檔案 -- 關關閉檔案閉檔案

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

上述函數的參數就是欲關閉檔案的上述函數的參數就是欲關閉檔案的 FILEFILE 指指標變數。標變數。

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

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

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

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

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

char *fgets(char *str, int num, FILE*fp)

讀取參數檔案 fp的內容到字串指標 str,一共讀取 num-1個字元,讀取成功,傳

回 str指標,否則傳回 NULL

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

10-2-2 10-2-2 讀寫字串到文字檔案讀寫字串到文字檔案 -- 範範例例

在在 CC 程式的文字檔案讀寫,可以使用程式的文字檔案讀寫,可以使用 fputs()fputs() 函函數寫入字串到文字檔案,如下所示:數寫入字串到文字檔案,如下所示:

fputs(line , fp);fputs(line , fp); 上述函數將字串上述函數將字串 lineline 寫入檔案指標寫入檔案指標 fpfp 。讀取檔。讀取檔

案內容可以使用案內容可以使用 fgets()fgets() 函數配合函數配合 whilewhile 迴圈讀迴圈讀取整個檔案內容,如下所示:取整個檔案內容,如下所示:

while( fgets(line, 50 ,fp) != NULL ) { }while( fgets(line, 50 ,fp) != NULL ) { } 上述上述 whilewhile 迴圈以一次一行的方式讀取檔案,每迴圈以一次一行的方式讀取檔案,每

一行最多為一行最多為 50-150-1即即 4949 個字元,直到個字元,直到 fgets()fgets() 函函數傳回數傳回 NULLNULL 為止,也就是到達檔尾。為止,也就是到達檔尾。

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

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

類似第類似第 44 章的章的 putchar()putchar()和和 getchar()getchar() 字字元輸出和輸入函數,檔案元輸出和輸入函數,檔案 I/OI/O 也提供讀寫字也提供讀寫字元的元的 putc()putc()和和 getc()getc() 函數,如下表所示:函數,如下表所示:

函數 說明int putc(int ch, FILE *fp) 將參數 ch字元寫入檔案 fp,寫入成功傳回字元

ch,否則傳回 EOF

char getc(FILE *fp) 讀取參數檔案 fp的內容,一次一個字元,讀取成功,傳回讀取的字元,否則傳回 EOF

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

10-2-3 10-2-3 讀寫字元到文字檔案讀寫字元到文字檔案 -- 範範例例

在在 CC 程式寫入字元到文字檔案可以使用程式寫入字元到文字檔案可以使用 putc()putc() 函函數,如下所示:數,如下所示:

putc(line[i][j] , fp);putc(line[i][j] , fp); 上述程式碼將二維字元陣列的上述程式碼將二維字元陣列的 line[i][j]line[i][j] 元素寫入元素寫入

檔案檔案 fpfp 。如果使用。如果使用 getc()getc() 函數讀取整個檔案內函數讀取整個檔案內容,一樣是配合容,一樣是配合 whilewhile 迴圈讀取,如下所示:迴圈讀取,如下所示:

while ((c = getc(fp))!= EOF )while ((c = getc(fp))!= EOF ) putchar(c);putchar(c); 上述上述 whilewhile 迴圈以一次一個字元的方式讀取檔案,迴圈以一次一個字元的方式讀取檔案,

直到直到 getc()getc() 函數傳回函數傳回 EOFEOF 為止,也就是到達檔為止,也就是到達檔尾。尾。

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

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

在第在第 44 章的章的 printf()printf()和和 scanf()scanf() 格式化輸格式化輸出和輸入函數,檔案出和輸入函數,檔案 I/OI/O 也有對應的也有對應的fprintf()fprintf()和和 fscanf()fscanf() 格式化輸出輸入函數,格式化輸出輸入函數,如下表所示:如下表所示:

函數 說明int fprintf(FILE *fp, char *control, …) 與 printf()函數相同,只是輸出到檔案 fp。

如果寫入成功,傳回輸出的字元,否則傳回 EOF

int fscanf(FILE *fp, char *control, …) 與 scanf()函數相同,只是從檔案 fp讀取,如果讀取成功,傳回讀取的字元,否則傳

回 EOF

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

10-2-4 10-2-4 格式化讀寫文字檔案格式化讀寫文字檔案 -- 範範例例

fprintf()fprintf() 格式化輸出函數可以使用格式字串來編格式化輸出函數可以使用格式字串來編排寫入檔案的字串內容,如下所示:排寫入檔案的字串內容,如下所示:

fprintf(fp, “%d=> %s\n”, 1, line);fprintf(fp, “%d=> %s\n”, 1, line); 上述程式碼是將格式字串輸入的內容寫入檔案上述程式碼是將格式字串輸入的內容寫入檔案 fpfp ,,

可以看到是組合整數常數和字串可以看到是組合整數常數和字串 lineline 的字串內容。的字串內容。同樣的,我們可以使用同樣的,我們可以使用 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 17: 第 10 章  檔案與資料夾處理

10-3 10-3 二進位檔案的讀寫二進位檔案的讀寫 10-3-1 10-3-1 寫入記錄到二進位檔案寫入記錄到二進位檔案 10-3-2 10-3-2 循序讀取檔案的記錄循序讀取檔案的記錄 10-3-3 10-3-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");

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; 上述結構擁有姓名上述結構擁有姓名 namename 、年齡、年齡 ageage 和成績和成績

scorescore 的成員變數,為了方便宣告,筆者建立新的成員變數,為了方便宣告,筆者建立新型態型態 studentstudent 。。

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

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

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

函數 說明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 到檔案到檔案 fpfp 。。 雖然檔案讀寫錯誤很少發生,不過為了避免磁碟雖然檔案讀寫錯誤很少發生,不過為了避免磁碟已滿等讀寫錯誤,在讀寫操作後,可以使用已滿等讀寫錯誤,在讀寫操作後,可以使用ferror()ferror() 函數檢查是否讀寫錯誤,如下所示:函數檢查是否讀寫錯誤,如下所示:

if ( ferror(fp) ) printf("if ( ferror(fp) ) printf(" 錯誤錯誤 : : 寫入錯誤寫入錯誤 !\n");!\n"); else printf("else printf(" 已經寫入已經寫入 33 筆記錄筆記錄 !\n");!\n");

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

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

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

函數 說明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) ) { if ( fread(&std, sizeof(std), 1, fp) ) { }if ( fread(&std, sizeof(std), 1, fp) ) { }}} 上述上述 whilewhile 迴圈使用迴圈使用 fread()fread() 函數讀取檔函數讀取檔

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

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

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

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

函數 說明int fseek(FILE *fp, long offset, int

origin)從參數的 origin位置開始計算位移 offset

後,將檔案 fp的檔案指標移到此位置,成功傳回 0,否則傳回非零值

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

long ftell(File *fp) 傳回 fp檔案指標的位置,如果有錯誤傳回-1

void rewind(File *fp) 重設 fp的檔案指標位置,成為檔案開頭

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 更改檔名與刪除檔案更改檔名與刪除檔案 在在 CC 語言標準函式庫語言標準函式庫 <stdio.h><stdio.h> 標頭檔提標頭檔提

供更改檔案名稱和刪除檔案的函數,其說供更改檔案名稱和刪除檔案的函數,其說明如下表所示:明如下表所示:

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

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); 上述上述 whilewhile 迴圈從檔案指標迴圈從檔案指標 sfpsfp呼叫呼叫 getc()getc()

函數讀取一個個字元,然後呼叫函數讀取一個個字元,然後呼叫 putc()putc() 函數函數寫入檔案指標寫入檔案指標 dfpdfp ,換句話說,檔案指標,換句話說,檔案指標sfpsfp 的檔案內容就會複製到的檔案內容就會複製到 dfpdfp 。。