浅谈freopen用法

众所周知,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) ;//暂停1秒,主要是让这个软件变得不那么突兀怪异
    cout<<"建议您作死前先制造一个放弃关机的文件,不然......后果自负"<<endl; 
    Sleep(1000);
    cout<<endl<<"---------按键继续----------" ;
    c=getch();//读取(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<<"搞定,您可以在当前文件夹下找到定时关机文件,再见" ;
         //因为这是在fropen之前的输出,所以会输出在控制台而不是文件中。
        freopen("定时关机.bat","w",stdout);
        //众所周知,可以用记事本输入一个shutdown在改变拓展名为bat改为批处理文件,然后便可实现关机。
        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; 
}
  • 31
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值