檔案操作(fgetc、fputc、fgets、fputs)

可以使用fopen()函式處理檔案輸入輸出,fopen()會傳回一個FILE實例的位址值,接著將FILE的位址傳給像是fgetc()、fputc()、fgets()、fputs()的函式。fopen()的第一個參數用來指定要開啟的檔案名稱,第二個參數用來指定檔案I/O模式,如果加上+表示檔案可讀可寫,如果加上b表示用二進位方式進行讀寫。

fopen()會使用緩衝區來減少對磁碟的實際I/O,以加快檔案讀寫效率,所以在程式中進行讀寫動作時,實際上會先對緩衝區作存取,而非實際的磁碟,所以不使用檔案時,一定要記得關閉檔案,關閉檔案會將緩衝區中的資料真正寫入磁碟,若忘了關閉檔案,可能會造成資料的遺失。

開啟檔案之後,可以使用fgetc()來讀取檔案中的字元,使用fputc()來將字元寫入檔案,fgetc()傳入FILE實例的位址值,每執行一次就會從檔案中讀取一個字元,直到讀到檔尾(End of File, EOF)為止,可由返回值來判斷是否讀到檔尾,下面程式碼以單一字元讀取純文字檔案,並將內容複製到另一個檔案。

#include<cstdio>

int main() {
    FILE *file1 = fopen("src.txt", "r"); 
    FILE *file2 = fopen("dst.txt", "w");

    char ch;                                      
    while((ch = fgetc(file1)) != EOF) { 
        fputc(ch, file2);
    } 

    fclose(file1);
    fclose(file2);

    return 0; 
}

也可以使用fgets()來讀取一段字串,使用fputs()來寫入一段字串,fgets()第一個參數為讀入字串儲存的陣列位址,第二個參數為要讀入的字元長度,由於字串必須包留最後一個元素為空白字元,所以實際讀入的長度為length-1,第三個參數為FILE位址值,而fputs()第一個參數為寫入的字串,第二個參數為FILE位址值,以下使用fgets()、fputs()來改寫程式。

#include<cstdio>

int main(){    
    FILE *file1 = fopen("src.txt", "r");  
    FILE *file2 = fopen("dst.txt", "w");

    char str[5];
    while(fgets(str, 5, file1) != NULL) { 
        fputs(str, file2);
    } 
    
    fclose(file1);
    fclose(file2);

    return 0; 
}