众所周知,freopen是一个非常好用的文件输入输出的函数,在各种信息学竞赛中都会有所使用。
至于它的原理嘛。。。。。。本蒟蒻也不知道。
所以本蒟蒻只能在此浅谈其用法.
1.最简单的用法
我这里指的最简单用法,就是它在竞赛中的常用用法了
一句
freopen("文件名.in","r",stdin);
freopen("文件名.out","w",stdout);
敢问天下谁oier不识君?
然而,它的拓展,也很简单的。。。
2. 稍加拓展
很简单
分解其本质,不过是:
freopen("文件名.拓展名","操作种类(我反正只知道有r&w)","标准输入输出");
所以,最方便的玩意儿,就是在out里面的拓展名动手脚,
如果您知道,c++文件拓展名为.cpp,c文件为.c等,那就很方便了;
如果我们编一个c++程序,然后拓展名改为.cpp.
那么很神奇的一幕发生了,这个文件一运行就会产生另一个cpp文件.
相当于这个文件诞生了另一个文件。
甚至还能把新文件中也加这种东西。
然后在再生出一个。。。
是不是很神奇???
而且很多Oier认为freopen只能放在文件的最前面,其实不然,freopen的位置是十分灵活的,在freopen语句执行过后,输出才会进入文件中,之前的输出仍然会在控制台中,输入也是同理的。而且一个程序中可以出现两个freopen in&out。
比如我们建两个in文件,将num1.in编辑为"Hello!",num2.in编辑为"World",那么以下代码执行会是这样。。。
`freopen("num1.in","r",stdin)`
gets(a);
puts(a);
`freopen("num2.in","r",stdin)`
gets(b);
puts(b);
这样a中会是Hello!,b中会是World,因为puts的自动换行,所以输出会是:
Hello!
World
不会有什么冲突。
3. 优劣势
比起其他较为简单的文件输入输出来说,freopen有优有劣
就说另一个代表性的文件输入输出fin&fout,fin&fout的主要优势在于它可以混用fin,cin,fout,cout,不用刻意控制它的位置,更加灵活便利
虽说fout&fin更加的灵活,但是freopen也胜在方便,能够用更多方式读入(scanf.getchar.getch.gets...),所以也有不少优势。
所以这两种输入输出流有优有劣,用起来还是要根据情况而定。
4.博主对fropen的使用
本蒟蒻刚刚写了一个比较愚蠢的小程序,主要是演示一下fropen在分支结构中的灵活运用,应该能给您一点小小的启发和更深的理解
PS:本程序产物请勿用于坑人...
#include<bits/stdc++.h>
#include <conio.h>
#include <windows.h>
using namespace std;
int main()
{
system("color f0");
system("title 关机软件工厂");
char c;
cout<<"欢迎来到关机软件工厂,这里有各种各样的关机bat文件"<<endl;
Sleep(1000) ;
cout<<"建议您作死前先制造一个放弃关机的文件,不然......后果自负"<<endl;
Sleep(1000);
cout<<endl<<"---------按键继续----------" ;
c=getch();
system("cls");
cout<<"请问您需要什么关机文件?"<<endl<<endl;
Sleep(1000) ;
cout<<"请输入对应编号"<<endl<<"1.定时关机"<<endl<<"2.立即关机(慎用!!!)"<<endl<<"3.放弃关机"<<endl<<"4.注销"<<endl<<"5.重启(慎用,too!!!)"<<endl<<"其他.我不需要,谢谢";
c=getch();
system("cls");
int a;
if(c=='1')
{
cout<<"请问您需要定时多久关机?(请输入秒数)";
cin>>a;
system("cls");
cout<<"搞定,您可以在当前文件夹下找到定时关机文件,再见" ;
freopen("定时关机.bat","w",stdout);
cout<<"shutdown -s -t "<<a;
Sleep(1000) ;
return 0;
}
if(c=='2')
{
system("cls");
cout<<"搞定,您可以在当前文件夹下找到立即关机文件,再见";
freopen("立即关机.bat","w",stdout);
cout<<"shutdown -s";
Sleep(1000) ;
return 0;
}
if(c=='3')
{
system("cls");
cout<<"搞定,您可以在当前文件夹下找到放弃关机文件,再见";
freopen("放弃关机.bat","w",stdout);
cout<<"shutdown -a";
Sleep(1000) ;
return 0;
}
if(c=='4')
{
system("cls");
cout<<"搞定,您可以在当前文件夹下找到注销文件,再见";
freopen("注销.bat","w",stdout);
cout<<"shutdown -l";
Sleep(1000) ;
return 0;
}
system("cls");
cout<<"好的,下次见!!!";
Sleep(1000) ;
return 0;
}