2013-07-08 18 views
0

Loki Astari規定this custom steam buffer。如何從cin :: cin讀取或當應用程序存在時將類更改爲自動刷新?例如:在程序出口和請求輸入時,自定義流緩衝區是否可以自動刷新?

int main() 
{ 
    MyStream myStream(std::cout); 
    myStream << "This does not print."; 
} 

int main() 
{ 
    MyStream myStream(std::cout); 
    myStream << "This does not print."; 
    std::cin.get(); 
} 

std::cout << "This does print."; 

std::cout << "This does print."; 
std::cin.get(); 

如果我強迫它

myStream << "This will now print." << std::flush; 

但是,我希望自動複製在程序退出或std :: cin觸發的cout行爲。

此作品(感謝約祖蒂斯的 「The C++標準庫」):

MyStream myStream(std::cout); 
    std::cin.tie(&myStream); 
    myStream << "This will now print."; 
    std::cin.get(); 

因爲std::cint.tie(&std::cout)是一個預定義的連接。

問題1:我可以修改MyStream類將其綁定到cin流,這樣我不必每次創建實例時都會發出std::cin.tie(&myStream)

問題#2:如何修改MyStream類,以便在程序退出時自動刷新緩衝區?

+1

在流的構造函數中調用'cin.tie(this)'。請記住,這將破壞'cin'與'cout'的關係。對於在程序退出時執行的東西,請使用具有析構函數的靜態對象。 –

+0

@ n.m。謝謝。把它放在答案的形式,我會標記它的答案。 :)有趣的是,cin.get()仍然會刷新cout&MyStream。如果我'myStream <<「打印」; cin.get(); cout <<「用cout打印」; cin.get()'都適當刷新。但是如果我'myStream <<「打印」; cout <<「用cout打印」;'console顯示'用cout Print'打印。 cout必須在myStream之前銷燬? –

回答

1
  1. 構造被設計在創建對象的時候做的事情,所以這將是適當的,建立在MyStream構造領帶:std::cin.tie(this);。這可能會破壞cincout之間存在的任何聯繫,並且或者在cin之間存在您的流類的另一個實例。
  2. 爲了在程序退出時做些事情,C++具有靜態存儲持續時間的對象的析構函數。
相關問題