檔案輸出入函數

一、檔案輸出入函數

之前我們寫過的程式,都是直接在鍵盤上輸入,而在螢幕上輸出,但是在很多的情況下,我們要輸入大筆資料,或是輸出的資料量很大的時候,就不適合在螢幕及鍵盤上輸出入,這時候我們可以將資料先輸入在檔案裡面,再從檔案讀取,最後再把結果輸出到另一個檔案。在標準的 C 語言中提供了一些標準的檔案輸出入函數,這些函數都是定義在 stdio.h 裡( stdio 即是 Stardard Input/Output 標準輸入/輸出,包括螢幕、鍵盤及檔案等的輸入/輸出):

fopen(檔案名稱, 模式) 以指定模式開啟檔案

fclose(檔案指標) 關閉檔案

fprintf(檔案指標, 格式字串, 參數一, 參數二....) 格式化輸出到檔案

fscanf(檔案指標. 格式字串, 變數一位址, 變數二位址,...) 從檔案格式化輸入

fputs(輸出字串, 檔案指標) 將字串輸出到檔案

fgets(字串位址, 最大長度, 檔案指標) 從檔案讀取字串

在使用檔案輸出入函數時,我們要先使用檔案指標變數:

FILE *fin, *fout;

上面宣告了兩個檔案指標變數 finfout,依照習慣,我們通常把要輸入的檔案指標定為 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

 

上一頁

首頁

下一頁