cout 流的重定向

流的重定向 收藏

<script type="text/javascript"> document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData("text"); if (text && text.length>300) { text = text + "/r/n/n本文来自CSDN博客,转载请标明出处:" + location.href; clipboardData.setData("text", text); } }, 100); } } </script> <script class="blogstory">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

在我的一项开发工作中,我要用到 Duan写的程序,我直接把他那个程序的代码原封不动的包含到我的程序中。

Duan的程序的输出是直接输出到标准输出也就是屏幕上的,而我的程序的输出是到 log文件里的。假如我直接去改动他的代码,那就会带来很多麻烦,在这种情况下,最简单的方法就是把标准输出流重新定向到文件中。

我采用替换流缓冲区的方法来重定向流,用 rdbuf函数拿一个文件流的缓冲区去替换 cout的缓冲区,这样送到 cout缓冲区的数据都会被送到这个文件中,等到程序结束时,再改回原来的流缓冲区。

 

#include

#include

int main()

{

    std::ofstream log(" foo . log ");

    std::streambuf * old buf = std::cout.rdbuf(log.rdbuf());

    std::cout << " 输出到标准输出,但实际输出到了 foo.log文件中 /n";

log << "输出到文件,虽然将 cout重定向到了 log,但不影响 log本身的使用 /n";

      // 恢复流缓冲区

    std::cout.rdbuf( old buf);

}

 

注意:

1 cout可以调用 rdbuf来替换缓冲区,但 log不能通过调用 rdbuf来替换缓冲区。因为 ofstream rdbuf并没有同样的功能。

2.对流的重定向,只是作用在一个代码块内 {},出了这个 {},就恢复为原来的了,但是对在这个代码块内调用的函数,重定向也会生效。

 

 

在窗口应用中使用printf,cout 等将输出重定向到console收藏 http://blog.csdn.net/royer/archive/2007/01/25/1492968.aspx 收藏

<script type="text/javascript"> document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData("text"); if (text && text.length>300) { text = text + "/r/n/n本文来自CSDN博客,转载请标明出处:" + location.href; clipboardData.setData("text", text); } }, 100); } } </script> <script class="blogstory">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script> AllocConsole();

 HANDLE hin 
=  ::GetStdHandle(STD_INPUT_HANDLE);
 HANDLE hout 
=  ::GetStdHandle(STD_OUTPUT_HANDLE);
 
 
int  hcin  =  _open_osfhandle((intptr_t)hin,_O_TEXT);
 FILE
*  fpin  =  _fdopen(hcin, " r " );
 
* stdin  =   * fpin; 

 
int  hcout  =  _open_osfhandle((intptr_t)hout,_O_TEXT);
 FILE
*  fpout  =  _fdopen(hcout, " wt " );
 
* stdout  =   * fpout;

 std::ios_base::sync_with_stdio();
  
 std::cout 
<<   " test " ;

 
int  i;
 std::cin 
>>  i;

 std::cout 
<<  i;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值