青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

不在浮沙筑高臺-demons
C++/OS/disassembly/Anti-virus
posts - 5,  comments - 5,  trackbacks - 0

Introduction:

  • This article mainly about how to use ios::rdbuf() function redirect the standard output stream to a file ,that is,redirect the cout output stream.
  • Two questions will be answered in this article: 1.how to redirect a stream. 2. what is the real face of cout,cin and  cerr.

     很多時(shí)候,我們?yōu)榱藢?shí)現(xiàn)一些特殊的目的,都會涉及到給控制臺輸出重定向的問題,比如在編寫GUI程序時(shí),為了調(diào)試方便,我們需要把一些中間結(jié)果輸出,但如果用MessageBox,

真是差強(qiáng)人意,輸個(gè)字符串還湊合,但如果要輸出個(gè)數(shù)值或者地址,我們就不得不創(chuàng)建一個(gè)CString對象將它們格式化成一個(gè)字符串再用MessageBox輸出,這可真辛苦!當(dāng)然每個(gè)人的

調(diào)試方法都不一樣,各有絕招。本文主要講述如何將 cout輸出流重定向到其他地方,比如一個(gè)文件,當(dāng)然如果你想在自己的GUI工程中把一些調(diào)試數(shù)據(jù)通過cout輸出到一個(gè)文件,或者

直接用cout寫日志,那么本文將會對你有幫助,其次如果當(dāng)你了解了重定向就、技術(shù)后,你將會重新認(rèn)識一些老朋友比如:cout, cin, cerr的真正身份。

    首先我們介紹一位 basic_ios 類中非常重要的一位成員,他就是ios::rdbuf().我們先來看看這個(gè)函數(shù)的定義(vs2008):

     typedef basic_streambuf<_Elem, _Traits> _Mysb;

    _Mysb *rdbuf() const
        {  
// return stream buffer pointer
        return (_Mystrbuf);
        }

     _Mysb * rdbuf(_Mysb *_Strbuf)
        {   
// set stream buffer pointer
        _Mysb *_Oldstrbuf = _Mystrbuf;
        _Mystrbuf = _Strbuf;
        clear();
        return (_Oldstrbuf);
        }

不難看出rdbuf()函數(shù)正是設(shè)置和修改io流指針的,正因?yàn)檫@個(gè)原因,我想到是否能通過修改io類關(guān)聯(lián)的緩沖區(qū)指針對其輸入輸出進(jìn)行重定向,當(dāng)然事實(shí)是樂觀的。作為示例,我對cout動(dòng)

手術(shù)。首先,把cout的輸出重定向到一個(gè)文件中,通過以下代碼實(shí)現(xiàn):

     ofstream dwout( "redirection.txt" );

     ofstream::_Mysb * org_cout= cout.rdbuf(dwout.rdbuf());

這樣一來,就成功把cout的輸出緩沖區(qū)流重定向到了"redirection.txt"文件,而不會輸出到控制臺,當(dāng)然我們應(yīng)該把原來流指針保存到 org_cout 里,用于恢復(fù)cout的流緩沖區(qū)。接下來

我們可以這樣:

     for (int i = 0; i < 5 ; i++)
      {
          cout<<"redirection ";
      }

"redirection.txt"中輸入5個(gè)"redirection "成功后會輸出到文件而不是控制臺。接下來就是打開"redirection.txt"文件,把文件內(nèi)容輸出到屏幕上,所以我們必須先恢復(fù)cout流,使它

輸出恢復(fù)到控制臺,然后來驗(yàn)證我們的重定向是否成功,代碼如下:

     dwin.open( "redirection.txt");

     cout<<dwin.rdbuf(); //這條語句可以直接輸出"redirection.txt"的全部內(nèi)容,這是rdbuf()的另一個(gè)強(qiáng)大功能。

下面是完整驗(yàn)證代碼,第一次打開文件寫 5個(gè)"duwen",然后輸出是為了驗(yàn)證cout<< file.rdbuf()可以將文件所有內(nèi)容一次性全部輸出,緊接著是重定向cout,然后寫cout 5個(gè)

"redirection",緊接著恢復(fù)cout流,將文件內(nèi)容輸出到控制臺,由于默認(rèn)打開方式是默認(rèn)out,所以第二次打開文件寫時(shí)(cout)會把文件內(nèi)容先清空,也就是把5 個(gè)"duwen”清空,所以

第二次顯示后,只顯示5個(gè)"redirection" :

    

/************************************************************************
  Description :  Redirect the cout stream.
  Notices      :  Copyright (c) Duwen
  TIME         :  Post time: 5/11/2012, write time:6/3/2011
***********************************************************************
*/

#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    //create a redirection file, and write 10 "duwen" in.

    ofstream dwout("redirection.txt");
    for (int i=0 ; i< 5 ; i++)
    {
        dwout<<"duwen  ";
    }
    dwout<<'\n';
    dwout.close();

    //Output the file contents
    ifstream  dwin("redirection.txt");
    cout<<dwin.rdbuf();//Note: this sentence can output whole file
    dwin.close();

   //Open  "redirection.txt", we'll redirect the stream buffer of "cout" latter.
    dwout.open("redirection.txt");
    //Redirect
    ofstream::_Mysb * org_cout=cout.rdbuf(dwout.rdbuf());
    for (int i = 0; i < 5 ; i++)
    {
    //We output 5 "redirection" which cannot  be shown on console, instead, it will be redirected to "redirection.txt".
        cout<<"redirection ";
    }
    dwout.close();
  //open redirection.txt.
    dwin.open("redirection.txt");
  //recover the stream buffer of cout ,that is, console
    cout.rdbuf(org_cout);

  //verify  if our redirection succeeded.
    cout<<dwin.rdbuf();
    cout<<endl;
  //Note: we mustn't close all the files we have opened, because the destructor of each file class did it automatically.
    return 0;
}

好了,有了上面的了解,你是否還能聯(lián)想到什么呢,探索永遠(yuǎn)都不會停止.

在我剛開始學(xué)習(xí)C++時(shí),總是對cout,cin,cerr充滿著好奇心,書上說它們都是一些全局流對象,就拿cout來說,書上說它是ostream的對象,但我試圖這樣 ostream myout 創(chuàng)造出我的 "cout”,時(shí)

編譯器是不會放行的,當(dāng)然,首先能想到的原因就是ostream沒有這樣的無參構(gòu)造函數(shù),于是我打開 ostream 文檔,里面有兩個(gè)構(gòu)造函數(shù),如下:

 	
 explicit  basic_ostream(basic_streambuf<_Elem, _Traits> *_Strbuf,bool _Isstd = false)
	
 basic_ostream(_Uninitialized, bool _Addit = true)

可是當(dāng)時(shí)的我還不能看懂這個(gè)聲明的意思,于是我就想著去看看cout的定義,于是我就點(diǎn)擊cout-轉(zhuǎn)到定義,得到的是__PURE_APPDOMAIN_GLOBAL extern _CRTDATA2 ostream cout;然后我把整個(gè)ostream文件搜了個(gè)遍,但還是沒找到,說了是全局對象,但又怎么也找不到,真欲抱琵琶半遮面,千呼萬喚不出現(xiàn),當(dāng)時(shí)我用了一種變通的方法創(chuàng)造出了我的myout, 怎么做的呢,你猜猜吧,呵呵,言歸正傳.其實(shí)我后來挖掘到這里的時(shí)候,產(chǎn)生了一個(gè)想法,仔細(xì)看我上面的代碼,我是先創(chuàng)建一個(gè)文件,然后把cout的流重定向到文件,再來看看ostream的第一個(gè)構(gòu)造函數(shù),我笑了,你想到了嗎...下面直接給出代碼:

//my cout
ofstream console(stdout);
ostream mycout(console.rdbuf());
//my cin
ifstream  input(stdin);
ostream myin(input.rdbuf());
//my cerr
ofstream error(stderr);
ostream mycerr(error.rdbuf());
好了,本文到此也應(yīng)該收筆了, 需要提醒讀者的是,io類族中除過ios_base類外其他的都可以用rdbuf進(jìn)行重定向,而不僅限于cout,本文只是以其示例.還有就是通過重定向可以方便實(shí)現(xiàn)其它很多功能,
比如用一個(gè)cin語句就可以把鍵盤輸入寫道文件等等,讀者應(yīng)該能舉一反三.最后,若復(fù)制轉(zhuǎn)載請注明原作者,請支持原作.
 
posted on 2012-05-11 12:20 demons 閱讀(3015) 評論(0)  編輯 收藏 引用 所屬分類: The standard C++

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

文章分類

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲网站视频福利| 国产亚洲欧洲| 久久久免费观看视频| 欧美精品久久久久久久| 久久久高清一区二区三区| 欧美日本韩国在线| 欧美国产丝袜视频| 激情91久久| 久久国产精品久久久久久电车| 亚洲一区二区少妇| 欧美日韩成人综合天天影院| 免费观看成人| 在线高清一区| 久久久久国产精品一区二区| 久久成人免费网| 国产欧美日韩综合一区在线播放 | 99亚洲一区二区| 久久综合给合久久狠狠色 | 中文无字幕一区二区三区| 亚洲精品视频啊美女在线直播| 久久久久久久久综合| 老**午夜毛片一区二区三区| 国产日韩欧美麻豆| 欧美一级视频| 久久九九热免费视频| 国内精品美女在线观看| 久久动漫亚洲| 欧美国产第二页| 亚洲黄色一区二区三区| 欧美r片在线| 亚洲区一区二| 亚洲天堂成人| 国产欧美日韩亚洲一区二区三区| 性8sex亚洲区入口| 久久中文字幕导航| 在线看片欧美| 欧美巨乳在线| 亚洲免费在线看| 久久久久久久综合色一本| 怡红院av一区二区三区| 欧美a级片网站| 一区二区三区黄色| 久久成人免费视频| 亚洲国产美女| 欧美性片在线观看| 先锋影音一区二区三区| 欧美成人一区在线| 中国亚洲黄色| 国内精品99| 欧美另类综合| 欧美亚洲一区二区在线| 亚洲大胆人体在线| 亚洲欧美精品suv| 有坂深雪在线一区| 欧美日韩国产123| 欧美一级午夜免费电影| 亚洲国产精品一区二区第一页 | a91a精品视频在线观看| 国产精品免费久久久久久| 久久人人爽爽爽人久久久| 亚洲开发第一视频在线播放| 欧美在线三级| av不卡在线观看| 国产在线观看精品一区二区三区| 欧美jizzhd精品欧美巨大免费| 亚洲视频免费在线| 免费欧美日韩国产三级电影| 亚洲无限av看| 亚洲成人在线视频网站| 国产精品女人毛片| 欧美国产一区视频在线观看| 性伦欧美刺激片在线观看| 亚洲欧洲精品一区二区精品久久久| 午夜激情一区| 一区二区三区产品免费精品久久75 | 亚洲午夜精品网| 在线日韩av永久免费观看| 国产精品mm| 欧美精品v日韩精品v国产精品| 欧美亚洲一级| 一区二区毛片| 亚洲欧洲一区二区在线观看 | 久久亚洲国产精品日日av夜夜| 亚洲午夜小视频| 一本色道久久88亚洲综合88 | 国产亚洲福利一区| 欧美视频免费在线观看| 免费不卡在线视频| 久久精品一区| 欧美一区二区三区男人的天堂 | 影音先锋亚洲视频| 国产人成精品一区二区三| 欧美日韩精品综合在线| 欧美黄色视屏| 久久综合久色欧美综合狠狠| 性欧美xxxx视频在线观看| 一二三四社区欧美黄| 亚洲精品国产精品乱码不99按摩 | 欧美成人a视频| 久久亚洲色图| 久久久久久亚洲精品杨幂换脸| 亚洲欧美怡红院| 午夜精品久久久久| 亚洲午夜羞羞片| 亚洲免费网址| 亚洲伊人伊色伊影伊综合网| 亚洲图片欧美午夜| 亚洲欧美日本精品| 亚洲午夜激情免费视频| 亚洲天堂av电影| 亚洲影院在线观看| 亚洲欧美日韩在线综合| 午夜精品一区二区三区在线| 亚洲欧美日韩成人高清在线一区| 亚洲一二三区视频在线观看| 亚洲影院色无极综合| 欧美亚洲一区二区在线| 久久久久久黄| 欧美jizz19性欧美| 欧美日韩国产一级| 国产精品va在线播放| 国产日韩在线亚洲字幕中文| 海角社区69精品视频| 一色屋精品亚洲香蕉网站| 亚洲国产乱码最新视频| avtt综合网| 性伦欧美刺激片在线观看| 久久久久久久高潮| 亚洲电影在线看| 一本色道88久久加勒比精品| 性18欧美另类| 美女视频一区免费观看| 欧美日韩在线三级| 国产精品一区一区三区| 尤物yw午夜国产精品视频明星 | 亚洲电影在线看| 在线亚洲自拍| 久久精品九九| 91久久精品国产91性色| 亚洲小说区图片区| 久久精品天堂| 欧美三区在线| 狠狠色综合色区| 在线亚洲电影| 久久综合999| 9l视频自拍蝌蚪9l视频成人| 欧美在线91| 欧美日韩高清在线播放| 国内精品伊人久久久久av一坑| 亚洲看片一区| 久久久久国产精品麻豆ai换脸| 亚洲国产高潮在线观看| 亚洲性图久久| 欧美不卡高清| 国产综合第一页| 亚洲视频在线免费观看| 裸体丰满少妇做受久久99精品 | 亚洲日韩欧美视频| 午夜激情综合网| 欧美精品一区二区精品网| 国产日本精品| 亚洲一区二区三区免费视频| 免费在线成人| 午夜在线视频一区二区区别| 欧美区视频在线观看| 在线日韩欧美| 久久精品国产第一区二区三区最新章节 | 国产精品卡一卡二卡三| 亚洲精品午夜| 欧美aaa级| 久久久久se| 国产欧美日韩另类视频免费观看 | 欧美一区二区三区四区视频| 亚洲黄色一区二区三区| 久久美女性网| 激情综合五月天| 久久精品国产亚洲精品| 亚洲在线一区二区三区| 欧美三级精品| 一区二区三区国产精品| 亚洲国产精品激情在线观看| 久久久久久久成人| 精品91免费| 美女主播一区| 久久综合伊人77777麻豆| 国产亚洲人成a一在线v站| 午夜精品久久| 亚洲免费伊人电影在线观看av| 欧美色视频一区| 亚洲天堂成人在线视频| 99伊人成综合| 国产精品分类| 欧美一级久久久久久久大片| 亚洲一区日本| 国产一区二区成人久久免费影院| 久久99伊人| 久久精品欧美日韩精品| 在线观看亚洲精品视频| 嫩草国产精品入口| 免费不卡中文字幕视频|