一个ACM题目的解决背后隐藏着大量的测试,只有自己觉得把自己所能够想到的一切可能都进行输入测试并得到正确答案时才敢尝试提交,毕竟在ACM比赛中是会进行罚时的,宁可多测试几次也不敢武断提交。然而多数题目光测试数据就已经很多了,如果测试时一次一次手动输入那将要耗费大量的时间,将要大大降低A题效率,这时候就体现出了函数freopen();的强大作用啦!

函数的声明:FILE *freopen( const char *filename, const char *mode, FILE *stream );

 

filename:需要重定向到的文件名或文件路径。

mode:代表文件访问权限的字符串。例如,"r"表示“只读访问”、"w"表示“只写访问”、"a"表示“追加写入”。

stream:需要被重定向的文件流,如标准输出流文件stdin/stdout/stderr,其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。通过调用freopen,就可以修改标准流文件的默认值,实现重定向。。

freopen也有返回值,如果成功,则返回该指向该输出流的文件指针,否则返回为NULL,但不常用。

freopen()函数重定向了标准流,使其指向指定文件。

下面给出经典样例:

#include<bits/stdc++.h>
using namespace std;
int main() {
    int a,b;
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    while(cin>>a>>b){
        cout<<a+b<<endl;
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}

该代码为从文本文件in中读入数据作为cin的输入数据,将cout所要输出的数据写入到文本文件out,最后需要使用fclose关闭流。

如果是读(r)的话需要先已存在该文本,如果是写(w)的话如果路径下已有该文本,将会对文本先进行清空操作再写入数据,如果没有该文件,将会在该程序存储目录下新建一个该文本,也可在文件名前指定路径如freopen("Debug\\out.txt","w",);只要路径写对,可以在该工程的任意文件夹下。

在比赛或者日常练习时如果遇到测试数据较多时可直接复制测试数据到读的文件中,修改是也可直接在文本文件中修改,免去了大量的重复工作,十分方便高效。

第一次写博客,肯定有很多不足之处,希望可以慢慢改进,这是一个开始!