檔案輸出入函數
一、檔案輸出入函數
之前我們寫過的程式,都是直接在鍵盤上輸入,而在螢幕上輸出,但是在很多的情況下,我們要輸入大筆資料,或是輸出的資料量很大的時候,就不適合在螢幕及鍵盤上輸出入,這時候我們可以將資料先輸入在檔案裡面,再從檔案讀取,最後再把結果輸出到另一個檔案。在標準的 C 語言中提供了一些標準的檔案輸出入函數,這些函數都是定義在 stdio.h 裡( stdio 即是 Stardard Input/Output 標準輸入/輸出,包括螢幕、鍵盤及檔案等的輸入/輸出):
fopen(檔案名稱, 模式) 以指定模式開啟檔案
fclose(檔案指標) 關閉檔案
fprintf(檔案指標, 格式字串, 參數一, 參數二....) 格式化輸出到檔案
fscanf(檔案指標. 格式字串, 變數一位址, 變數二位址,...) 從檔案格式化輸入
fputs(輸出字串, 檔案指標) 將字串輸出到檔案
fgets(字串位址, 最大長度, 檔案指標) 從檔案讀取字串
在使用檔案輸出入函數時,我們要先使用檔案指標變數:
FILE *fin, *fout;
上面宣告了兩個檔案指標變數 fin、fout,依照習慣,我們通常把要輸入的檔案指標定為 fin (file in),而輸出的檔案指標為 fout (file out),接下來我們用 fopen() 函數開啟一個檔案,語法如下:
fin=fopen("xxx1","rt");
fout=fopen("xxx2","w+t");
上面的例子中,我們開啟了兩個檔案,我們用 "rt" 開啟檔案來提供輸入(Read Text),而用 "w+t" 來提供輸出(Write Text),多了一個 "+" 代表更新,也就是如果該檔已存在,會直接覆蓋過去。開啟完成後,要檢查檔案指標是不是 NULL,如果是的話,就代表開啟失敗,便要結束程式:
if(fin==NULL) {
printf("Fail To Open File xxx!!");
return;
}
如果開啟成功,接下來就可以用 fscanf()、fgets() 等函數從檔案讀取資料,用 fprintf()、fputs() 等函數來把結果寫入檔案。這些檔案和 scanf()、gets()、printf()、gets() 的用法相似,只差要多一個檔案的指標而已。最後,我們要用 fclose() 函數來將開啟的檔案關閉,這樣資料才會真正寫入:
fclose(fin);
fclose(fout);
二、3N+1的例子
有一種數列型態如下:3、10、5、16、8、4、2、1,它的最後一項一定是 1,而第一項由使用者自行給予,它的規則是,如果這一項是奇數,則它的下一項為這一項的三倍加一,如果這一項是偶數,則它的下一項是這一項的一半,如此重覆下去,直到 1 為止。現在輸入一個整數 N,將每一項的結果印出來,直到最後一項 1 為止,每一項用一行表示,我們先用鍵盤輸入、螢幕輸出的方式來寫這個程式:
#include <stdio.h>
void main()
{
int n;
scanf("%d",&n);
while(n>1) {
printf("%d\n",n);
if( (n%2)==0 ) n/=2;
else n=n*3+1;
}
printf("%d\n",n);
}
接下來我們將它改成由檔案 in1.txt 輸入,再將結果輸出到檔案 out1.txt,我們先用記事本寫一個數字,將檔案儲存在 Turbo C++ 的工作目錄(通常是 C:\TC\BIN 或 從 FILE->Change dir 檢查),接下來執行完成後,該資料夾應該會出現一個 out1.txt 的檔案。整個程式如下:
#include <stdio.h>
void main()
{
FILE *fin, *fout;
int n;
fin=fopen("in1.txt","rt");
if(fin==NULL) {
printf("Fail To Open File in1.txt!!");
return;
}
fout=fopen("out1.txt","w+t");
if(fout==NULL) {
printf("Fail To Open File out1.txt!!");
fclose(fin);
return;
}
fscanf(fin,"%d",&n);
while(n>1) {
fprintf(fout,"%d\n",n);
if( (n%2)==0 ) n/=2;
else n=n*3+1;
}
fprintf(fout,"%d\n",n);
fclose(fin);
fclose(fout);
}
三、練習
先下載 in2.txt 到 Turbo C++ 的工作目錄(按右鍵存檔),該檔為 100 名學生從小到大得到過的獎狀數目,請計算出全體學生的獎狀數目之總和,並將結果輸出到檔案 out2.txt。