一、重定向型

格式:

FILE *freopen(const char *filename, const char *mode, FILE *stream );

freopen("pro.in","r",stdin);
freopen("pro.out","w",stdout);
fclose(stdin);
fclose(stdout);

$ filename $ 要打开的文件名

$ mode $ 文件打开的模式,和 $ fopen $ 中的模式( $ r/w $ )相同

$ stream $ 文件指针,通常使用标准流文件( $ stdin/stdout/stderr $ )

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

使用 $ freopen() $ 函数的优点:

我们不再需要修改 $ scanf $ ,$ printf $ ,$ cin $ 和 $ cout $ 。而是维持代码的原样就可以了。因为 $ freopen() $ 函数重定向了标准流,使其指向前面指定的文件,省时省力。最后只要使用 $ fclose $ 关闭输入文件和输出文件即可。

需调用头文件 $ \color{red} {cstdio} $ 。

二、$ fopen $ 型

格式:

#include <cstdio>
#include <iostream>

using namespace std;

int a, b, c;
char s[20];
FILE *fin, *fout;

int main()
{
    fin = fopen("pro.in", "rb");
    fout = fopen("pro.out", "wb");
    fscanf(fin, "%d %d", &a, &b);
    scanf("%d", &c);
    fprintf(fout, "%d", a + b + c);
    printf("%d", a * b * c);
    return 0;
}

pro.in输入:  1 2
终端输入:    4
pro.out输出: 7
终端输出:    8

$ fopen $ 对 $ scanf,printf $ 适用。

先声明变量 $ fin $ 和 $ fout $ ,把 $ scanf $ 改成 $ fscanf $ ,第一个参数为 $ fin $ ;把 $ printf $ 改成 $ fprintf $ ,第一个参数为 $ fout $ ,最后执行 $ fclose $ ,关闭两个文件。

三、文件输入输出流

格式:

#include <fstream>

using namespace std;

int a, b, c;
char s[20];

int main()
{
    ifstream fin("pro.in");
    ofstream fout("pro.out");
    fin >> a >> b;
    fout << a + b;
    return 0;
}

若想用fin作为输入对象,fout作为输出对象,则可以使用如下定义:

ifstream  fin("输入文件名.扩展名");
ofstream  fout("输出文件名.扩展名");

如果想再次使用cin和cout,只需要把fin和fout的声明语句去掉,并加上这样两行即可:

#define fin cin
#define fout cout