2009-10-18 69 views
0

有人可以写一些示例代码来解释这个概念吗? 我知道什么是缓冲流,但我也想知道如何实现。在C++中,系统如何实现缓冲流?

在此先感谢!

+0

你是什么意思? stringstream是如何实现的,或者std :: cin/cout? – GManNickG 2009-10-18 09:16:48

+0

缓冲流,就像otl中的流一样 – MemoryLeak 2009-10-18 09:26:17

回答

0

看看STL的实施 sstreamsstream.tcc(链接到SGI STL实现)。

基类stringstream类是basic_stringstream,它实现了basic_iostream接口。

// [27.7.4] Template class basic_stringstream 
    /** 
    * @brief Controlling input and output for std::string. 
    * 
    * This class supports reading from and writing to objects of type 
    * std::basic_string, using the inherited functions from 
    * std::basic_iostream. To control the associated sequence, an instance 
    * of std::basic_stringbuf is used, which this page refers to as @c sb. 
    */ 

有基类basic_stringbufbasic_streambuf派生。这包含缓冲区。

// [27.7.1] template class basic_stringbuf 
    /** 
    * @brief The actual work of input and output (for std::string). 
    * 
    * This class associates either or both of its input and output sequences 
    * with a sequence of characters, which can be initialized from, or made 
    * available as, a @c std::basic_string. (Paraphrased from [27.7.1]/1.) 
    * 
    * For this class, open modes (of type @c ios_base::openmode) have 
    * @c in set if the input sequence can be read, and @c out set if the 
    * output sequence can be written. 
    */ 
1

Veeeery示意性地,一个“输入”流:

class BufferedInputStream 
{ 
public: 
    BufferedInputStream(SomeExternalDevice d) 
    : m_Device(d), 
    m_Current(m_Buffer), 
    m_End(m_Buffer) 
    {} 

    char get(){ 
    if (!IsDataAvailableInBuffer()){ 
     ReadAChunkFromDiskAndPutItInBuffer(); 
    } 
    return PopByteFromBuffer(); 
    } 

private: 

    bool IsDataAvailableInBuffer()const{ 
    return m_Current != m_End; 
    } 

    void ReadAChunkFromDiskAndPutItInBuffer(){ 
    // Buffer must be empty 
    assert(!IsDataAvailableInBuffer()); 

    // Read bytes from the device 
    bytes_read = Read(m_Device, m_Buffer, BufferSize); 

    // Reposition the "begin" and "end" pointers 
    m_Current = m_Buffer; 
    m_End = m_Buffer + bytes_read; 
    } 

    char PopByteFromBuffer(){ 
    assert(IsDataAvailableInBuffer()); 
    return *m_Current++; 
    } 

    // For example, an OS file handle 
    SomeExternalDevice m_Device; 

    // The buffer itself 
    char m_Buffer[BufferSize]; 

    // Begin of buffer contents 
    char* m_Current; 

    // End of buffer contents 
    char* m_End; 
}; 

这样,数据从磁盘中的缓冲区的大小的组块读出,并且最调用“取得()”不必在调用OS时结束,因为它们可以简单地从缓冲区返回一个字节。