Frage

Kann jemand einen Beispielcode schreiben, um dieses Konzept zu erklären? Ich weiß, wofür ein gepufferter Stream verwendet wird, aber ich würde auch gerne wissen, wie man das implementiert.

Danke im Voraus!

War es hilfreich?

Lösung

Sie können die Implementierung Ihrer Plattform, den C ++ - Standard oder in die Plattform prüfen oder "Standard C ++ iOstreams und Orte" von Angelika Langer und Klaus Kreft.

Seien Sie auf eine ziemlich Lernkurve vorbereitet. Streams sind alt und eine komplizierte Angelegenheit. (Francis Glassborow: "Ich habe nur wenige Zweifel daran, dass I/O -Bibliotheken zu den schwierigsten Aspekten jeder Sprache gehören.")

Andere Tipps

Veeeery schematisch für einen "Eingabe" -Stream:

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

Auf diese Weise werden Daten von der Festplatte in Stücken der Größe des Puffers gelesen, und die meisten Anrufe "Get ()" müssen nicht in Anrufe zum Betriebssystem landen, da sie einfach ein Byte aus dem Puffer zurückgeben können.

Schauen Sie sich die STL -Implementierung anSstreamundsstream.tcc (Links zur SGI STL -Implementierung).

Die Basis stringstream Klasse ist basic_stringstream, was die implementiert basic_iostream Schnittstelle.

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

Es gibt die Basisklasse basic_stringbuf was aus basic_streambuf. Dies hält den Puffer.

  // [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.
  */
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top