2013-07-08 16 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++具有静态存储持续时间的对象的析构函数。
相关问题