在上一篇文章中,我們初步瞭解了freopen()函數的用法。但在一些算法競賽中不允許使用文件重定向操作,這時我們就只能用標準C頭文件stdio.h中的fopen()函數進行對文件的讀寫了。
fopen()函數的不足之處就在於使用的方法複雜,寫起來比較麻煩。但是它靈活度比freopen()要高得多,比如支持多文件同時讀寫等等。
實現方法:在main函數之前定義一個類型爲FILE*的指針,並使它指向創建的文件。
FILE* fp1 = fopen("D:\\abc.in", "r"); FILE* fp2 = fopen("D:\\abc.out", "w");
同樣地,fopen的第一個參數爲文件的路徑和名稱,第二個參數爲文件操作的模式(在上一篇文章初步介紹過,用法一樣)。當文件打開失敗,則返回值爲NULL。最後別忘記要調用fclose()。
下面仍然是一個實例,不過要比上一次的難一點,但還是很簡單。
【輸入】輸入文件爲abc.in:一組整數,它們的數量未知
【輸出】輸出文件爲abc.out:第一行輸出這組整數的個數,第二行輸出這些整數的和。
源代碼如下(在VS2008下編譯通過):
int main(void) { FILE* input = fopen("D:\\abc.in", "r"); if (input == NULL) { printf("Failed to open the file!\n"); return -1; } //如果打開失敗,則退出程序 FILE* output = fopen("D:\\abc.out", "w"); int a, sum = 0, total = 0; while(fscanf(input, "%d", &a) != EOF) //在還未讀到EOF時不斷統計數字個數total和總和sum { sum += a; total++; }; fprintf(output, "Sum is %d.\n", sum); fprintf(output, "There are %d numbers.\n", total); fclose(input); fclose(output); return 0; }
分析這段代碼,我們得到兩個函數:
int fscanf(FILE *stream, const char *format, ...); int fprintf(FILE *stream, const char *format, ...);
不難看出,他們分別表示對文件進行讀寫操作。與scanf和printf相似,只是第一個參數是指向指定文件的指針。這一點就沒有freopen()函數那麼簡單。
好的,以上就是文件I/O的標準函數的常用部分。