使用的理由(范围):如果输入数据很庞大,需要一次又一次的重新输入和调试时可采用本函数。

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

#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)< span="">

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

以上程序在VC6.0环境测试通过。
 

C语言中输入输出重定,freopen()妙用。的更多相关文章

  1. Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数

    Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1 ...

  2. c语言中的文件流

    一.打开和关闭文件 #include int main( void ) { FILE* pReadFile = fopen( "E:\\mytest.txt", "r&q ...

  3. C语言中史上最愚蠢的Bug

    C语言中史上最愚蠢的Bug   本文来自“The most stupid C bug ever”,很有意思,分享给大家.我相信这样的bug,就算你是高手你也会犯的.你来看看作者犯的这个Bug吧.. 首 ...

  4. C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期

    全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...

  5. C语言中的宏定义

    目录(?)[-] 简单宏定义 带参数的宏 运算符 运算符 宏的通用属性 宏定义中圆括号 创建较长的宏 较长的宏中的逗号运算符 宏定义中的do-while循环do 空操作的定义 预定义宏 C语言中常用的 ...

  6. C语言中整形数组、字符数组、字符串的区别

    一. 第一 整型数组的存放,数组最后是不加'\0'的,字符串会自动加上,因此存放字符的时候数组的大小要比实际字符的多一个 第二 整型数组 每一个单元是4个字节的,字符串是一个一个字符存放的,每个字符占 ...

  7. 在C语言中利用PCRE实现正则表达式

    1. PCRE简介 2. 正则表达式定义 3. PCRE正则表达式的定义 4. PCRE的函数简介 5. 使用PCRE在C语言中实现正则表达式的解析 6. PCRE函数在C语言中的使用小例子 1. P ...

  8. 在易语言中调用MS SQL SERVER数据库存储过程方法总结

    Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...

  9. C语言中结构体赋值问题的讨论

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

随机推荐

  1. UVa 10330 Power Transmission / 最大流

    最大流 这题有很多起点和终点 在取2个点(0和n+1) 作为唯一的起点和终点 此外每个点也有容量限制 建图时每条边上的容量为这条边和2个端的容量的最小值 然后EK就行 #include <cst ...

  2. C#游戏框架uFrame

    C#游戏框架uFrame兼谈游戏架构设计 c#语言规范 阅读目录 1.概览 2.基本概念 3.依赖注入 4.Manager of Managers 5.利用UniRX实现响应式编程 6.研究总结 回到 ...

  3. debian网易163更新服务器 源

    sudo vi /etc/apt/sources.list 加入如下内容即可: deb http://mirrors.163.com/debian/ jessie main non-free cont ...

  4. Android开发之大位图二次採样压缩处理(源码分享)

    图片有各种形状和大小.在很多情况下这些图片是远远大于我们的用户界面(UI)且占领着极大的内存空间,假设我们不正确位图进行压缩处理,我们的程序会发生内存泄露的错误. MainActivity的代码 pa ...

  5. CodeForces 462B Appleman and Card Game(贪心)

    题目链接:http://codeforces.com/problemset/problem/462/B Appleman has n cards. Each card has an uppercase ...

  6. zoj 1134 - Strategic Game

    题目:给你一棵树.找到最小的顶点集合,使得全部的边至少有一个顶点在这个集合中. 分析:树形dp,图论,最小顶点覆盖. 方案1:树形dp.分别记录每一个节点取和不取的最优解f(k.0)与f(k,1): ...

  7. POJ 1258-Agri-Net (Kruskal)

    题目链接:Agri-Net 最小生成树水题,数组开的和题目描写叙述一样,可是就是RE,有填了个0,还好这个题用 库鲁斯卡尔 敲了一遍,发现了点问题,曾经写的库鲁卡尔模板有点问题,多写了步没用的操作,已 ...

  8. 略懂 MySQL字符集

    本文虽说旨在明白.但若略懂亦可.毕竟诸葛孔明如是     只有基于字符的值才有所谓字符集的概念     某些字符集可能需要更多CPU.消费更多的内存和磁盘空间.甚至影响索引使用     这还不包括令人 ...

  9. 认识axure部件库中各个部件的属性

    在axure中每一个部件都有自己的属性,下面这个表格,我们就首先来了解认识一下!以下内容来自网站蓝图,版权归原作者所有! 属性名称 属性说明 属性举例 标签 用来标示部件的名称,在axure中,部件名 ...

  10. Gitolite v3安装配置指南

    使用gitolite对git仓储进行权限配置 gitolite在近期做了很多代码改动,升级到了v3版本,而我使用的是v3.5.2.在<Git权威指南>中所提及的是v2版本,有很多东西已经不 ...