C語言中輸入輸出重定向,freopen的用法和實例


使用的理由(范圍):如果輸入數據很龐大,需要一次又一次的重新輸入和調試時可采用本函數。

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<stdio.h>

#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<n)

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<stdio.h>
#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<n)
   max=n;
  if(min>n)
   min=n;
  i++;
 }
 fprintf(fout,"%d %d %.3lf",min,max,(double)sum/i);
 fclose(fin);
 fclose(fout);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM