大家在准备CSP-J/S认证的时候,肯定都在网上不断地做题,刷题。现在,网上大多数的OJ(Online Judge)都是使用标准输入输出(stdin,stdout),即,程序运行后,弹出一个窗口,手动输入内容;回车后,会在同一个窗口输出运行结果。但是在CSP-J/S认证(包括NOI一系列比赛)要求使用文件输入和输出。

这种使用文件的输入、输出方式,可以将硬盘上的文件调入程序,程序运行完成后,生成另外一个文件。这一点在NOI系列比赛中非常重要、非常重要、非常重要!!!如果没有按照要求正确地使用文件进行输入、输出,即使算法完全正确,也不能得分。例如,2020年CSP-J2的题目《优秀的拆分》,C++源程序文件为power.cpp,输入文件名为power.in,输出的文件名为power.out。

img

下面介绍在NOI比赛中,利用对标准输入输出进行重定向的方式,来读取和写入文件。

大家可以不必纠结什么是重定向,只要记住函数freopen的用法就可以了。函数freopen包含在标准库cstdio中,所以在程序开始必须包含头文件#include<cstdio>。

文件操作基本步骤

1、打开文件,将文件指针指向文件,决定打开文件类型。

2、对文件进行读写操作。

3、使用完文件后,关闭文件。

freopen用法

命令格式

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

参数说明

filename:要打开的文件名。

mode:文件打开的模式(读或者写)r/w。

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

使用方法

接下来,我们使用freopen函数打开power.in和power.out,其中使用只读模式打开power.in,使用写入模式打开power.out。

1
2
freopen("power.in", "r", stdin);
freopen("power.out", "w", stdout);

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

完整的代码模板:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	freopen("7532.in", "r", stdin);
	freopen("7532.out", "w", stdout);
    //原来的代码保持不变
	double a, b, r;
	int k;
	cin >> a >> b;
	k = int(a/b);
	r = a - b * k;
	printf("%g", r);
    //-------------
	fclose(stdin);
	fclose(stdout);
	return 0;
} 

在平时大家练习的时候,本地调试程序也可以使用文件输入输出。这样做的好处是不需要每次运行程序时,都要用键盘敲一遍输入。只需要在记事本中写好输入数据并保存,每次调试可以直接运行程序,这样节约时间。当然,也可以只重定向输入,这样运行程序后,结果和之前一样显示在弹出窗口中。

公众号:格致书院