使编译器不自动刷新缓冲区
make the compiler not to automatically flush the buffer
为什么下面的代码没有阻止编译器自动刷新缓冲区?
cout.sync_with_stdio(false);
cin.tie(nullptr);
cout << "hello";
cout << "world";
int a;
cin >> a;
输出:
helloworld
我正在使用Visual Studio 2012 Ultimate
AFAIK,只要实现愿意,就可以刷新流,即不能保证在插入操作后会刷新流。然而,你可以使用其中一个操纵器来确保你的流被刷新(这是我唯一知道的操纵器,所以如果有人知道其他操纵器,请评论):
- CCD_ 1-在流中插入新行并刷新它
- CCD_ 2-只是刷新流
std::(no)unitbuf
-启用/禁用每次插入操作后冲洗流
标准允许实现在任何时候刷新喜欢它,但从实现质量的角度来看真的没想到这里会有洪水。您可以尝试添加一个setbuf
,告诉std::cin
使用您指定的缓冲区:
std::cout.rdbuf()->setbuf( buffer, sizeof(buffer) );
同样,该标准不能保证任何东西,但如果不是尊敬的是,我认为质量差到足以保证出现错误汇报
最后,如果情况越来越糟,您可以随时插入一个过滤流buf,它可以进行您想要的缓冲。你不应该这样做,但这不是我们第一次不得不这样做编写额外的代码来解决编译器质量不足的问题或库。如果您所做的只是简单的输出(否寻求或任何类似以下内容的操作技巧:
class BufferingOutStreambuf : public std::streambuf
{
std::streambuf* myDest;
std::ostream* myOwner;
std::vector<char> myBuffer;
static size_t const bufferSize = 1000;
protected:
virtual int underflow( int ch )
{
return sync() == -1
? EOF
: sputc( ch );
}
virtual int sync()
{
int results = 0;
if ( pptr() != pbase() ) {
if ( myDest->sputn( pbase(), pptr() - pbase() )
!= pptr() - pbase() ) {
results = -1;
}
}
setp( &myBuffer[0], &myBuffer[0] + myBuffer.size() );
return results;
}
public:
BufferingOutStreambuf( std::streambuf* dest )
: myDest( dest )
, myOwner( NULL )
, myBuffer( bufferSize )
{
setp( &myBuffer[0], &myBuffer[0] + myBuffer.size() );
}
BufferingOutStreambuf( std::ostream& dest )
: myDest( dest.rdbuf() )
, myOwner( &dest )
, myBuffer( bufferSize )
{
setp( &myBuffer[0], &myBuffer[0] + myBuffer.size() );
myOwner->rdbuf( this );
}
~BufferingOutStreambuf()
{
if ( myOwner != NULL ) {
myOwner->rdbuf( myDest );
}
}
};
那就做:
BufferingOutStreambuf buffer( std::cout );
作为CCD_ 6中的第一行。(有人可能会说iostreams应该从一开始就设计成这样工作过滤streambuf以缓冲和代码转换。但是事实并非如此,这个不应该是一个体面的实施。)
相关文章:
- C++字符*缓冲区的大小
- 如何让 cout 缓冲区在 ubuntu 上刷新
- 缓冲区刷新究竟是如何工作的(std::endl 和 之间的区别)?
- 换行符是否也会刷新缓冲区?
- 输出缓冲区无法刷新的情况?
- 如何刷新或清除 GetAsyncKeyState 的缓冲区
- 何时刷新输出缓冲区
- C++ 刷新缓冲区
- 如何在获得下一个字符后正确刷新输入缓冲区,而无需按两次回车键!C++
- 如何在使用FFmpeg写入mp4文件时将缓冲区数据刷新到磁盘
- 缓冲区刷新:"n" vs. 标准::endl
- 使编译器不自动刷新缓冲区
- 可以在程序退出时和请求输入时自动刷新自定义流缓冲区
- 我可以通过控制std::ofstream中的缓冲区刷新来获得性能吗
- boost::asio程序中的刷新缓冲区
- 将fseek函数在c++中刷新缓冲区中的数据
- 如何在不刷新缓冲区的情况下打印换行符
- 为什么我们刷新流而不是缓冲区
- 缓冲区何时刷新
- Linux c写入后刷新串行缓冲区