组别:普及组
难度: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; } |
例题二:从文件中读入一组数据,计算数据的和。
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
文件输入输出中常见错误: