文件的重定向

组别:普及组
难度:2

【命令格式】
    FILE * freopen ( const char * filename, const char * mode, FILE * stream );
【参数说明】
filename: 要打开的文件名
mode: 文件打开的模式,和fopen中的模式(r/w)相同
stream: 文件指针,通常使用标准流文件(stdin/stdout/stderr)
其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;
stderr是标准错误流,一般把屏幕设为默认。通过调用freopen,就可以修改标准流文件的默认值,实现重定向。

【使用方法】
因为文件指针使用的是标准流文件,因此我们可以不定义文件指针。接下来我们使用freopen()函数以只读方式r(read)打开输入文件slyar.in。
  格式:freopen(“slyar.in”, “r”, stdin);    然后使用freopen()函数以写入方式w(write)打开输出文件slyar.out。
 格式:freopen(“slyar.out”, “w”, stdout);
接下来的事情就是使用freopen()函数的优点了,我们不再需要修改scanf,printf,cin和cout。而是维持代码的原样就可以了。因为freopen()函数重定向了标准流,使其指向前面指定的文件,省时省力。最后只要使用fclose关闭输入文件和输出文件即可。
格式:fclose(stdin);fclose(stdout);
若要恢复句柄,可以重新打开标准控制台设备文件,只是这个设备文件的名字是与操作系统相关的。
格式:freopen(“CON”, “r”, stdin);

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include<cstdio>                              //使用freopen语句,须调用cstdio库
#include<iostream>
using namespace std;

      int main() {
         freopen("reopen.in", "r", stdin);
         freopen("reopen.out", "w", stdout);
         int a;
         cin>>a;
         cout<<a;
  
         fclose(stdin);
         fclose(stdout);      
         return 0;
      }

edit & run

例题二:从文件中读入一组数据,计算数据的和。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include<iostream>
using namespace std;
int main()
{
   freopen("reopen.in","r",stdin);                //定义输入文件名
   freopen("reopen.out","w",stdout);          //定义输出文件名
   int temp,sum=0;
   while (cin>>temp)       //(cin>>temp)从输入文件中读入数据
    {
        sum=sum+temp;
     }
  cout<<sum;                       // cout<<sum<<endl;
    fclose(stdin);fclose(stdout);            //关闭文件,可省略
   return 0;                                               
}

习题1:在in.txt中有若干个数字,找到最大的数字,输出到out.txt中。
例如:
in.txt中有 4 5 6 8 2 9 10 3
运行后out.txt中是10

习题2:
在input.in中有若10个数字(4 3 8 1 2 9 6 10 5 7),找出最小的数字,输出到output.out中
answer1 answer2

文件输入输出中常见错误:

  • 没有使用<cstdio>头文件
  • 没有使用文件输入输出
  • 输入输出文件名错误
  • 文件输入输出位置写错
  • 文件输入输出语句英文括号全部写成了中文括号
  • 函数名freopen写错
  • 输入输出文件名读写模式错误
  • 选手在http://xxx.in和xxx.out的前面都加上了.\\,unix环境下评测编译错误
  • 调试中文件输入输出注释了,忘记取消注释
  • 强烈建议文件输入输出重定向用freopen()
Scroll to Top