注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天道酬勤 玩物丧志

用勇气去改变可以改变的事情,用胸怀去包容无法改变的事情,用智慧去判断两者的区别

 
 
 

日志

 
 

C程序freopen()实现快速从文件输入和输出(重定向)到文件(ACM练习好帮手)  

2012-08-22 21:45:24|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

做ACM练习题,一个程序需哟啊反复调试,而且每次调试都要重复的输入大量的数据,非常的麻烦,如果能够避免每次手动输入,而改为从文件输入那就方便多了,每次调试的时候都从指定的文件读取数据,而不用手动从控制台输入,freopen函数很好的实现了这一功能:


函数原型:
FILE * freopen ( const char * filename, const char * mode, FILE * stream );
【参数说明】

filename: 要打开的文件名
mode: 文件打开的模式,和fopen中的模式(r/w)相同
stream: 文件指针,通常使用标准流文件(stdin/stdout/stderr)


【使用方法】

因为文件指针使用的是标准流文件,因此我们可以不定义文件指针。
接下来我们使用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);

若要恢复句柄,可以重新打开标准控制台设备文件,只是这个设备文件的名字是与操作系统相关的。

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


例子:
#include <stdio.h>
int main()
{
freopen("slyar.in", "r", stdin);
freopen("slyar.out", "w", stdout);


/* 中间按原样写代码,什么都不用修改 */

fclose(stdin);
fclose(stdout);

return 0;
}
 

一、freopen()输出输出重定向(到文件)

 

      当我们求解acm题目时,通常在设计好算法和程序后,要在调试环境(例如VC等)中运行程序,输入测试数据,当能得到正确运行结果后,才将程序提交到oj中。但由于调试往往不能一次成功,每次运行时,都要重新输入一遍测试数据,对于有大量输入数据的题目,输入数据需要花费大量时间。 
      使用freopen函数可以解决测试数据输入问题,避免重复输入,不失为一种简单而有效的解决方法。 

函数名:freopen 
声明:FILE *freopen( const char *path, const char *mode, FILE *stream ); 
所在文件: stdio.h 
参数说明: 
path: 文件名,用于存储输入输出的自定义文件名。 
mode: 文件打开的模式。和fopen中的模式(如r-只读, w-写)相同。 
stream: 一个文件,通常使用标准流文件。 
返回值:成功,则返回一个path所指定文件的指针;失败,返回NULL。(一般可以不使用它的返回值) 
功能:实现重定向,把预定义的标准流文件定向到由path指定的文件中。标准流文件具体是指stdin、stdout和stderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。 


        下面以在VC下调试“计算a+b”的程序举例。

文件位置示意:

A. 在VS工程中,文件路径是相对于Test.cpp而言的

Txt代码  收藏代码
  1. //VS工程中的结构:  
  2. --我的工程  
  3.      --Debug  
  4.           --Test.exe  
  5.      --我的工程  
  6.           --Test.cpp  
  7.           --Debug  
  8.                --in.txt  
  9.                --out.txt  

B. 在实际应用中(例如,将Test.exe复制出来作为一个单独的程序使用),文件路径则是相对于Test.exe而言的

Txt代码  收藏代码
  1. --Test.exe  
  2. --Debug  
  3.      --in.txt  
  4.      --out.txt            
 


C语法:

C代码  收藏代码
  1. #include<stdio.h>  
  2. int main(){  
  3.     int a,b;  
  4.     freopen("debug\\in.txt","r",stdin);//输入重定向,输入数据将从in.txt文件中读取  
  5.     freopen("debug\\out.txt","w",stdout);//输出重定向,输出数据将保存在out.txt文件中  
  6.   
  7.     while(scanf("%d %d",&a,&b)!=EOF){  
  8.         printf("%d\n",a+b);  
  9.     }  
  10.   
  11.     fclose(stdin);  //关闭输入流  
  12.     fclose(stdout); //关闭输出流  
  13.     return 0;  
  14. }  

 


C++语法

Cpp代码  收藏代码
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. int main(){  
  5.     int a,b;  
  6.     freopen("Debug\\in.txt","r",stdin);  
  7.     freopen("Debug\\out.txt","w",stdout);  
  8.   
  9.     while(cin>>a>>b){   //和C唯一的区别就是输入使用>>,而非scanf();输出使用<<,而非printf()  
  10.         cout<<a+b<<endl;    //和C唯一的区别就是输入使用>>,而非scanf();输出使用<<,而非printf()  
  11.     }  
  12.   
  13.     fclose(stdin);  
  14.     fclose(stdout);  
  15.   
  16.     return 0;  
  17. }  
 


        freopen("Debug\\in.txt","r",stdin)的作用就是把标准输入流stdin重定向到Debug\\in.txt文件中,这样在用scanf或是用cin输入时便不会从标准输入流读取数据,而是从in.txt文件中获取输入。只要把输入数据事先粘贴到in.txt,调试时就方便多了。 
        类似的,freopen("Debug\\out.txt","w",stdout)的作用就是把stdout重定向到Debug\\out.txt文件中,这样输出结果需要打开out.txt文件查看。 

        需要说明的是: 
        1. 在freopen("debug\\in.txt","r",stdin)中,将输入文件in.txt放在文件夹Debug中,文件夹Debug是在VC中建立工程文件时自动生成的调试文件夹。如果改成freopen("in.txt","r",stdin),则in.txt文件将放在所建立的工程文件夹下。in.txt文件也可以放在其他的文件夹下,所在路径写正确即可。 
        2. 可以不使用输出重定向,仍然在控制台查看输出。 
        3. 程序调试成功后,提交到oj时不要忘记把与重定向有关的语句删除:)

 

二、打表格csv

看一个程序就明白鸟:)

Cpp代码  收藏代码
  1. /*线段树空间分析程序 Power By:Comzyh*/    
  2. #include <iostream>    
  3. #include <cstdio>    
  4. #include <cstdlib>    
  5. using namespace std;    
  6. struct segment {    
  7.        int b,e;    
  8.        };    
  9. segment seg[5000000];    
  10. int N;    
  11. int Nnode,LastNode;    
  12. void build(int b, int e, int s);    
  13. int main(){    
  14.     freopen ("segmentCount.csv","w",stdout);    
  15.     int i=1;    
  16.     scanf("%d",&N);    
  17.     printf("区间长度,节点数,最后一个节点编号\n");    
  18.     while (N-i>=0){    
  19.           Nnode=0;    
  20.           LastNode=0;    
  21.           build(1,i,1);    
  22.           printf("%d,%d,%d\n",i,Nnode,LastNode);    
  23.               
  24.           i++;    
  25.           }    
  26.     //system("pause");    
  27.     }    
  28. void build(int b, int e, int s){    
  29.      Nnode++;    
  30.      if (s>LastNode)    
  31.         LastNode=s;    
  32.      seg[s].b=b;    
  33.      seg[s].e=e;    
  34.      if (b==e)    
  35.          return;    
  36.      int mid =(b+e)>>1;    
  37.      build(b,mid,s<<1);    
  38.      build(mid+1,e,(s<<1)+1);    
  39.      }   
 
  评论这张
 
阅读(1352)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018