2013-05-18 42 views
0

我有這個程序,應該爲std::cout禁用緩衝。我想打印出我寫到輸出設備的內容,但是當我打印str時,什麼都沒有出來。無緩衝的I/O不起作用

#include <iostream> 
#include <sstream> 
#include <string> 

int main() 
{ 
    std::cout.rdbuf()->pubsetbuf(0, 0); 
    std::cout.unsetf(std::ios::unitbuf); 

    std::cout << "Hello, World\n"; 

    std::stringstream ss; 
    ss << std::cout.rdbuf(); 

    std::string str{ss.str()}; 

    std::cout << str; // nothing 
    // str.size() == 0 
} 

回答

3
std::cout.rdbuf()->pubsetbuf(0, 0); 

這是因爲cout沒有指定是使用std::filebuf不一定做任何事情。

std::cout.unsetf(std::ios::unitbuf); 

清除unitbuf位,因此I/O是緩衝。調用setf應該根據需要請求無緩衝的I/O。

ss << std::cout.rdbuf(); 

這試圖閱讀 COUT所以它會解壓什麼。

僅僅依靠setf(std::ios::unitbuf)works as expected

#include <iostream> 
#include <unistd.h> 

int main() { 
    std::cout.setf(std::ios::unitbuf); 

    std::cout << "Hel"; 
    write(1, "lo, wo", 6); 
    std::cout << "rld!\n"; 
}