使编译器不自动刷新缓冲区

make the compiler not to automatically flush the buffer

本文关键字:刷新 缓冲区 编译器      更新时间:2023-10-16

为什么下面的代码没有阻止编译器自动刷新缓冲区?

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以缓冲代码转换。但是事实并非如此,这个不应该是一个体面的实施。)