使用的理由(范圍):如果輸入數據很龐大,需要一次又一次的重新輸入和調試時可采用本函數。
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指定的文件中。標准流文件具體是指stdin、stdout和stderr。其中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()函數的優點了,我們不再需要修改scanf和printf,而是維持代碼的原樣就可以了。因為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);
}