freopen 的使用

来源:互联网 发布:mac os x 如何升级 编辑:程序博客网 时间:2024/05/20 21:49

使用的调试环境为gdb, 编译器为gcc,g++。(服务器就是用的这个)
每当做ACM题目的时候都是写好程序然后运行,输入题目中所给的测试数据,但是调试往往不
是一次两次就能解决问题的。一般的题目还行。遇到像 Web Navigator 这样的有大量的输入的题目
就头痛了。而freopen函数就提供了一种非常简单的解决方法。

函数名:freopen
声明:FILE *freopen( const char *path, const char *mode, FILE *stream );
所在文件: stdio.h
参数说明:
path: 文件名。
mode: 文件打开的模式。和fopen中的模式(如r, w,)相同。
stream: 一个文件,通常使用标准流文件(stdin, stdout, stderr)。

返回值:成功,则返回一个path所指定的文件的指针。失败,返回NULL。(一般都不使用它的返回值)


功能:简单说,就是实现重定向。把预定义的几个标准流文件(stdin, stdout, stderr)定向到由path指定的文件中。
如下例:
int main()
{
//        freopen("debug\\in.txt","r",stdin);
        while(cin>>ans)
        {
                          //to do .......
        }
        cout<<endl;
        return 0;
}
freopen("debug\\in.txt","r",stdin)的作用就是把stdin重定向到debug\\in.txt文件中,这样在用cin或是
用scanf输入时便不会从标准输入流提取数据。而是从in.txt文件中获取输入。只要把输入事先粘贴到
in.txt,调试时就方便多了。
                                                          ------------------------by 王海斌


但并不存在一个完全兼容的解决方案能够在以后将标准句柄恢复。在C标准库里面是没有办法的。


Addition:

我用的是Red Flag Linux5.0
用 freopen("/dev/console", "r", stdin); 无法恢复
将"/dev/console"改为"/dev/tty"成功了

进行如下操作:

[code@tzq ~]$ echo "hello" > /dev/tty
hello
[code@tzq ~]$ echo "hello" > /dev/console
bash: /dev/console: 权限不够
[code@tzq ~]$

不知道是不是不是root,权限不够的原因。
很容易想到的方式是重新打开标准控制台设备文件,但遗憾的是,这个设备文件的名字是操作系统相关的。

    * 在DOS/Win中,这个名字是CON,因此可以使用
      PLAIN TEXT
      C++:
         1.
            freopen("CON", "r", stdin)

    * 在linux中,控制台设备是 /dev/console
      PLAIN TEXT
      C++:
         1.
            freopen("/dev/console", "r", stdin)

另外,在类unix系统中,可以使用dup系统调用来预先复制一份原始的stdin句柄。


                                                       ---------------------------by skywind

转载:http://hi.baidu.com/joopoo/blog/item/47906b6617c0ff27aa184c2c.html

原创粉丝点击