Domanda

Qualcuno può scrivere del codice di esempio per spiegare questo concetto? So per cosa è usato un flusso bufferico, ma vorrei anche sapere come implementarlo.

Grazie in anticipo!

È stato utile?

Soluzione

Puoi esaminare l'implementazione della tua piattaforma, lo standard C ++ o "Standard C ++ iostreams and Locales" di Angelika Langer e Klaus Kreft.

Preparati a una curva di apprendimento piuttosto. I flussi sono vecchi e una questione complicata. (Francis Glassborow: "Ho pochissimi dubbi sul fatto che le biblioteche I/O siano tra gli aspetti più difficili di qualsiasi lingua.")

Altri suggerimenti

Veeeery schematicamente, per un flusso "input":

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;
};

In questo modo, i dati vengono letti dal disco in blocchi delle dimensioni del buffer e la maggior parte delle chiamate per "ottenere ()" non devono finire nelle chiamate al sistema operativo, poiché possono semplicemente restituire un byte dal buffer.

Dai un'occhiata all'implementazione STL persstreamesstream.tcc (Collegamenti all'implementazione SGI STL).

La base stringstream La classe è basic_stringstream, che implementa il basic_iostream interfaccia.

  // [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.
  */

C'è la classe base basic_stringbuf che deriva da basic_streambuf. Questo contiene il buffer.

  // [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.
  */
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top