1. 程式人生 > >freopen (stdin stdout ) 詳解+例項

freopen (stdin stdout ) 詳解+例項

今天做USACO  用到了檔案的操作。 之前做USACO只是格式化的些 寫  freopen("xxx.in","r",stdin)  和"freopen("xxx.out","w",stdout)"  

百度百科上是這麼介紹的:

    函式名: freopen

  功 能: 替換一個流,或者說重新分配檔案指標,實現重定向。如果stream流已經開啟,則先關閉該流。如果該流已經定向,則freopen將會清除該定向。此函式一般用於將一個指定的檔案開啟一個預定義的流:標準輸入、標準輸出或者標準出錯。  用 法: FILE *freopen(const char *filename,const char *type, FILE *stream);

例1:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()  
  4. {  
  5.     if(freopen("file.txt","w",stdout)==NULL)  
  6.         fprintf(stderr,"error\n");  
  7.     printf("This is in the file\n");      //這句話會在file.txt中顯示。
  8.     fclose(stdout);               //使用fclose()函式就可以把<a href="http://baike.baidu.com/view/266782.htm" target="_blank">緩衝區</a>內最後剩餘的資料輸出到磁碟檔案中,並釋放檔案指標和有關的緩衝區。
  9.     return 0;  
  10. }  

例2:

  1. //首先在同路徑下建立一個in.txt文字文件寫入若干數字
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int main()  
  5. {  
  6.     freopen("in.txt","r",stdin);     //從in.txt 中讀入資料
  7.     freopen("out.txt","w",stdout);  // 將最後資料寫入out.txt中
  8.     int a,b;  
  9.     while(scanf("%d%d",&a,&b)!=EOF)     //資料是從in.txt中輸入的
  10.         printf("%d\n"
    ,a+b);             //寫入out.txt中
  11.     fclose(stdin);  
  12.     fclose(stdout);  
  13.     return 0;  
  14. }  

 freopen("CON","w",stdout)  表示在控制檯視窗上寫入資料;

例3:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()  
  4. {  
  5.    // FILE *stream;
  6.     freopen("file1.txt","w",stdout);  
  7.     printf("this is in file1.txt");      // 這句話在file1.txt中顯示
  8.     freopen("CON","w",stdout);  
  9.     printf("And this is in command.\n");    //這句話在控制檯上顯示
  10.     return 0;  
  11. }  

例5:  關於fread   可以通過下面的程式,一看就知道什麼意思了

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()  
  4. {  
  5.     FILE *stream  
  6.     char s[102400]="";  
  7.     if((stream=freopen("file.txt","r",stdin))==null)  
  8.         exit(-1);  
  9.     fread(s,1,1024,stdin);    // 讀取file.txt中1到1024位,放入s中 ,我是這麼理解的
  10.     printf("%s\n",s);  
  11.     return 0;  
  12. }  

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

freopen ()函式:

1.格式

FILE * freopen (constchar* filename,constchar* 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

  1. #define TEST
  2. #include
  3. #define MM 1000
  4. main()  
  5. {  
  6. #ifdef TEST
  7. freopen("d:\\c2_4_in.txt","r",stdin);  
  8. freopen("d:\\c2_4_out.txt","w",stdout);  
  9. #endif
  10. int i=0,sum=0,n,max=-MM,min=MM;  
  11. while(scanf("%d",&n)==1)  
  12. {  
  13. sum=sum+n;  
  14. if(max<N)< SPAN>  
  15. max=n;  
  16. if(min>n)  
  17. min=n;  
  18. i++;  
  19. }  
  20. printf("%d %d %.3lf\n",min,max,(double)sum/i);  
  21. }  


說明:(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:

  1. 相關推薦

    freopen (stdin stdout ) +例項

    今天做USACO  用到了檔案的操作。 之前做USACO只是格式化的些 寫  freopen("xxx.in","r",stdin)  和"freopen("xxx.out","w",stdout)"  百度百科上是這麼介紹的:    函式名: freopen  功 能: 替換一個流,或者說重新分配檔案指標,

    java 的位運算子例項 ------與(&) 、或( |) 、非( ~) 、異或( ^)

    位運算子主要針對二進位制,它包括了:“與”、“非”、“或”、“異或”。從表面上看似乎有點像邏輯運算子,但邏輯運算子是針對兩個關係運算符來進行邏輯運算,而位運算子主要針對兩個二進位制數的位進行邏輯運算。下面詳細介紹每個位運算子。   1.與運算子 與運算子用符號“&”表示,

    linux中alarm函式和pause函式例項

    轉載原文:https://www.cnblogs.com/yxk529188712/p/4982401.html alarm(time);執行之後告訴核心,讓核心在time秒時間之後向該程序傳送一個定時訊號,然後該程序捕獲該訊號並處理; pause()函式使該程序暫停讓出CPU,但是該函式的暫停

    WebStorm + BootStrap 安裝 用 Tomcat 部署Web專案(圖文 + 例項

                                     WebStorm安裝和破解 1.官網下載 2.安裝

    Eclipse 安裝+ 用 Tomcat 部署Web專案(圖文 + 例項

                                              Ecl

    C++中的freopen()函式使用

    所謂重定向輸出,就是可以把原本只是輸出在控制檯的字元,輸出到你指定的路徑檔案中。(輸入類似,就是從指定的檔案中讀取,而不是讀取在控制檯中的輸入。)重定向函式可以在任何時候開啟、關閉。   函式名:freopen  標準宣告:FILE *freopen( const c

    ajax引數+例項

    ajax很多時候都能用到,在網上看到了很多關於ajax引數的介紹,但是都沒有提供實際的詳解。來做個小總結以防不時之需。 1.url 要求為String型別的引數,(預設為當前頁地址)傳送請求的地址。 2.type 要求為String型別的引數,請求方式(post或ge

    location 引數 例項展示

    location.href 設定或返回完整的 URL。在瀏覽器的位址列上怎麼顯示它就怎麼返回。 location.protocol:協議名.取值有'https:','https:','file:' 等等。 location.host=location.hostname+l

    【轉】XML和Schema名稱空間---例項

    上文把XML和Schema的名稱空間的一些相關內容進行了詳細介紹,下面通過例子來具體瞭解:     例一:重點理解名稱空間的相關概念。    下面的例子是一個XML Schema檔案,名為"note.xsd" <?xml version="1.0"?>&

    【Spring】定時任務例項[email protected]

    最近在做專案,時間比較緊張,也有比較久沒寫部落格了。 現在專案的Redis快取需要用到定時任務,就學習了一下Spring 的@Scheduled註解。使用起來很簡單。 這個例子是建立在之前我的一篇部落格的例項上面的。 也就是架好了SSM框架。 SSM

    Java的位運算子例項

    Java的位運算子詳解例項——與(&)、非(~)、或(|)、異或(^) 位運算子主要針對二進位制,它包括了:“與”、“非”、“或”、“異或”。從表面上看似乎有點像邏輯運算子,但邏輯運算子是針對兩個關係運算符來進行邏輯運算,而位運算子主要針對兩個二進位制數的位進行邏輯運算。下面詳細

    python閉包+例項演示

    轉載自:http://www.cnblogs.com/blueel/archive/2012/12/28/2837673.html “閉包”這個詞語相信大多數學過程式設計的同學並不陌生,但是有時候理解起來還是有一定難度。先看定義: 閉包是由函式和與其相關的引用環境組合而成

    ORACLE函式之GREATEST函式例項

    1語法GREATEST(expr_1, expr_2, ...expr_n)2說明GREATEST(expr_1, expr_2, ...expr_n)函式從表示式(列、常量、計算值)expr_1, e

    Delphi 中WebBrowser控制元件例項

    uses mshtml,IdHTTP;procedure TFrmmain.Act_BeginWrite;varmyitem:Olevariant;i:integer;tmp:string;TemName:String;TemIniFile:TIniFile;beginTrymyitem := WebBrow

    Spring事務管理(+例項

    寫這篇部落格之前我首先讀了《Spring in action》,之後在網上看了一些關於Spring事務管理的文章,感覺都沒有講全,這裡就將書上的和網上關於事務的知識總結一下,參考的文章如下: 1 初步理解 理解事務之前,先講一個你日常生活中最常乾的事:取錢

    Java技術_基礎技術(0003)_類執行順序+例項(阿里面試題)+詳細講解+流程圖

    基礎技術: 對於java類各個成員的執行順序,現拿出阿里的面試題作為樣例(例子非常好,是用心出的題),在這裡重新說明一下java類執行順序的原則。 原始碼下載(包含題、結果、分析過程)

    Java---DOM解析XML文件例項

    文件物件模型(Document Object Model,簡稱DOM)package cn.hncu.dom; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml

    uml類圖設計系統例項

    •什麼是類 面向物件思想 特例 抽象 •每個物件都扮演了一個角色,併為其它成員提供特定的服務或執行特定的行為。 •在面向物件世界中,行為的啟動是通過將“訊息”傳遞給對此行為負責的物件來完成的;同時還將伴隨著執行要求附上相關的資訊(引數);而收到該訊息的物件則會執行相應的“方法”來實現需求 •用

    Mysql快捷鍵+經典Mysql語句大全完整版--+例項

    下列語句部分是Mssql語句,不可以在access中使用。  SQL分類:  DDL—資料定義語言(CREATE,ALTER,DROP,DECLARE)  DML—資料操縱語言(SELECT,DELETE,UPDATE,INSERT)  DCL—資料控制語言(GRANT,REVOKE,COMMIT,ROLLB

    XML和Schema名稱空間---例項

    上文把XML和Schema的名稱空間的一些相關內容進行了詳細介紹,下面通過例子來具體瞭解:     例一:重點理解名稱空間的相關概念。     下面的例子是一個XML Schema檔案,名為"not