C語言中輸入輸出重定,freopen()妙用。

2puT發表於2016-07-14

使用的理由(範圍):如果輸入資料很龐大,需要一次又一次的重新輸入和除錯時可採用本函式。

freopen ()函式:

1.格式

FILE * freopen ( const char * filename, const char * mode, FILE * stream );

2.引數說明

filename: 要開啟的檔名

mode: 檔案開啟的模式,和fopen中的模式(r/w)相同

stream: 檔案指標,通常使用標準流檔案(stdin/stdout/stderr)

返回值:成功,則返回一個path所指定檔案的指標;失敗,返回NULL。(一般可以不使用它的返回值) 
功能:實現重定向,把預定義的標準流檔案定向到由path指定的檔案中。標準流檔案具體是指stdinstdoutstderr。其中stdin是標準輸入流,預設為鍵盤;stdout是標準輸出流,預設為螢幕;stderr是標準錯誤流,一般把螢幕設為預設。通過呼叫freopen,就可以修改標準流檔案的預設值,實現重定向。

3.使用方法

因為檔案指標使用的是標準流檔案,因此我們可以不定義檔案指標。

接下來我們使用freopen()函式以只讀方式r(read)開啟輸入檔案slyar.in

freopen("slyar.in", "r", stdin);

然後使用freopen()函式以寫入方式w(write)開啟輸出檔案slyar.out

freopen("slyar.out", "w", stdout);

接下來的事情就是使用freopen()函式的優點了,我們不再需要修改scanfprintf,而是維持程式碼的原樣就可以了。因為freopen()函式重定向了標準流,使其指向前面指定的檔案

最後只要使用fclose關閉輸入檔案和輸出檔案即可。

fclose(stdin);

fclose(stdout);

若要恢復控制程式碼,可以重新開啟標準控制檯裝置檔案,只是這個裝置檔案的名字是與作業系統相關的。

DOS/Windows:

freopen("CON", "r", stdin);

Linux:

freopen("/dev/console", "r", stdin);

4.演算法實

輸入一些整數,求出它們的最小值、最大值和平均值(保留3位小數)。輸入保證這些數都是不超過1000的整數。

樣例輸入:2 8 3 5 1 7 3 6

樣例輸出:1 8 4.375

參考程式1

#define TEST

#include

#define MM 1000

main()

{

#ifdef TEST

freopen("d:\\c2_4_in.txt","r",stdin);

freopen("d:\\c2_4_out.txt","w",stdout);

#endif

int i=0,sum=0,n,max=-MM,min=MM;

while(scanf("%d",&n)==1)

{

sum=sum+n;

if(max

max=n;

if(min>n)

min=n;

i++;

}

printf("%d %d %.3lf\n",min,max,(double)sum/i);

}

說明:(1)對於本題來說,我們使用了重定向簡單地說,就是程式中用標準輸入scanf()函式輸入的資料從d:\c2_4_in.txt中讀取,printf()函式輸出的資料直接寫入d:\c2_4_out.txt中去,螢幕上不在等待輸入資料和不再顯示輸出結果。

2)如果把第一句去掉(#define TEST),

#ifdef TEST

freopen("d:\\c2_4_in.txt","r",stdin);

freopen("d:\\c2_4_out.txt","w",stdout);

#endif

就不起任何作用,這時還必須用標準輸入輸出。

 

參考程式2:

#include
#define MM 1000
main()
{
 FILE *fin,*fout;
 fin=fopen("d:\\c2_4_in.txt","rb");
 fout=fopen("d:\\c2_4_out.txt","wb");
 int i=0,n,sum=0,max=-MM,min=MM;
 while(fscanf(fin,"%d",&n)==1)
 {
  sum+=n;
  if(max   max=n;
  if(min>n)
   min=n;
  i++;
 }
 fprintf(fout,"%d %d %.3lf",min,max,(double)sum/i);
 fclose(fin);
 fclose(fout);
}

 

以上程式在VC6.0環境測試通過。

相關文章