输入/输出重定向

输入/输出重定向

前言

  在我学习 C 语言的初期,一直有个麻烦,因为打印的调试或者结果信息过多,一屏显示不下,所以很多时候我看不到前面打印出来的信息,唯一的方法就是不停地按 CTRL+ALT+PAUSE 组合键来暂停输出 ~~~ 有心要把它改成文件输出吧,想到要一个一个地把 printf 改成 fprintf (那时还不懂文本编辑工具),又怕了。真想有个简单有效的办法!!!后来才知道,有个东西叫重定向———

 

是什么

  所谓重定向就是把某应用原来的操作对象改成别的。比如说,我这个程序原来是从键盘接收信息的,现在改从一个叫 config.ini 的文件中接收信息了;本来输出的信息都显示在屏幕上的,现在我不显示在屏幕上了,我要输出到 result.txt 文本中保存起来。

 

怎么做

方法一: freopen

   如果你手中有源代码的话,你只需要在代码的前面加一句话:

         

FILE  * stream; 

stream 
=  freopen(  " out.txt " " a+ " , stdout );

   就行了。这样,你就把程序中原定输出到屏幕的信息重定向到 out.txt 中了 , 且不覆盖 out.txt 中的内容,只是把新的输出追加在文件尾。这是一个 ANSI C 函数,所以是跨平台的。具体可以参考 MSDN

 

方法二、管道命令

 

  如果非常不幸地,你只有可执行文件,而没有源代码可以修改,操作系统为你提供了管道命令。在 windows cmd 命令中有两个管道命令是专门用来进行 I/O 重定向的。

 

1.   >,>> 输出重定向命令
将一条命令或某个程序输出结果的重定向到特定文件中 , > >> 的区别在于, > 会清除调原有文件中的内容后写入指定文件,而 >> 只会追加内容到指定文件中,而不会改动其中的内容。

2.    < , >& , <& 输入重定向命令
<
从文件中而不是从键盘中读入命令输入。
>&
将一个句柄的输出写入到另一个句柄的输入中。
<&
从一个句柄读取输入并将其写入到另一个句柄输出中。

有了这两个,我如果想把程序中原定输出到屏幕的信息重定向到 out.txt, 且只追加不覆盖原有内容的话,就可以这样做:

        command( 程序名 ) >> out.txt

更进一步地,如果我想把原来打印到 stderr stdout 的信息全部重定向到一个文件 out.txt 中,也可以:

       command( 程序名 ) >> out.txt  1>&2

   这里的 1 2 分别是 stdout stderr 在系统中的句柄,有:

STDIN      0 键盘输入

STDOUT    1 输出到命令提示符窗口

STDERR    2 错误输出到命令提示符窗口

     

 

  

 
扩展: T 型管道

 

更过分地,如果既想能够实时从屏幕上看到信息,又想能够把信息存储到一个文件中备案的话怎么办?海涛的专栏 3 】中提出了在 windows 系统中模拟 UINX 命令 tee 的想法。命令 tee 就像它的名字一样,充当管道 T 型接头。将输出分成两个流,一个流到文件中,另一个仍然输出到屏幕上去。真是非常形象的说法!海涛还给出了程序,但是不知道什么原因,该程序在我的机子上达不到效果,所以我对程序进行了一些小的改动,达到了目的。下面给出程序清单:


#include   < stdio.h >

int  main( int  argc,  char   ** argv)

{

  FILE 
* fp;

  
int  c;

  
if  ( argc  >   1  )  

  {

    fp 
=  fopen(argv[ 1 ],  " a+ " );

    
if  ( fp  ==  NULL )  

       {

      fprintf(stderr, 
" %s: can not open <%s>/n " , argv[ 0 ], argv[ 1 ]);

      
return   - 1 ;

    }

  } 

  
else

  {

    fp 
=  stdout;

  }

  
while  ( (c  =  fgetc(stdin))  !=  EOF )

  {

    fputc(c,fp);

       
if  (fp  !=  stdout)

       {

         fputc(c,stdout);

       }

  }

  
return   0 ;

}

   把上面这个 程序编译连接生成tee.exe 文件后,只要使用命令:

        command( 程序名 ) | tee  out.txt

就可以达到目的了。

最后说明一下,上面的 | 也是一个管道运算符,它可以捕获命令的输出并作为下一个命令的输入发送。具体可以参考后面列出的参考资源。

 

参考资源

1.       关于文件重定向

1.1   http://book.51cto.com/art/200806/75392.htm

1.2   http://www.diybl.com/course/6_system/linux/linuxjq/2007211/17270.html

2.       关于 cmd 组合命令与管道命令

2.1   http://blog.chinaunix.net/u1/48222/showart_1080170.html

2.2   http://www.jysls.com/thread-330436-1-1.html

2.3   http://book.51cto.com/art/200811/99161.htm

3.       海涛的专栏

   http://blog.csdn.net/billow_zhang/archive/2009/07/30/4392427.aspx

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值