C++ Tutorial/File Stream/streambuf — различия между версиями

Материал из C\C++ эксперт
Перейти к: навигация, поиск
м (1 версия: Импорт контента...)
 
(нет различий)

Текущая версия на 13:31, 25 мая 2010

data buffer for stream

<source lang="cpp">/* The following code example is taken from the book

* "The C++ Standard Library - A Tutorial and Reference"
* by Nicolai M. Josuttis, Addison-Wesley, 1999
*
* (C) Copyright Nicolai M. Josuttis 1999.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
  1. include <iostream>
  2. include <cstdio>
  3. include <streambuf>

// for write():

  1. ifdef _MSC_VER
  2. include <io.h>
  3. else
  4. include <unistd.h>
  5. endif

class outbuf : public std::streambuf {

 protected:
   static const int bufferSize = 10;   // size of data buffer
   char buffer[bufferSize];            // data buffer
 public:
   /* constructor
    * - initialize data buffer
    * - one character less to let the bufferSizeth character
    *    cause a call of overflow()
    */
   outbuf() {
       setp (buffer, buffer+(bufferSize-1));
   }
   /* destructor
    * - flush data buffer
    */
   virtual ~outbuf() {
       sync();
   }
 protected:
   // flush the characters in the buffer
   int flushBuffer () {
       int num = pptr()-pbase();
       if (write (1, buffer, num) != num) {
           return EOF;
       }
       pbump (-num);    // reset put pointer accordingly
       return num;
   }
   /* buffer full
    * - write c and all previous characters
    */
   virtual int_type overflow (int_type c) {
       if (c != EOF) {
           // insert character into the buffer
           *pptr() = c;
           pbump(1);
       }
       // flush the buffer
       if (flushBuffer() == EOF) {
           // ERROR
           return EOF;
       }
       return c;
   }
   /* synchronize data with file/destination
    * - flush the data in the buffer
    */
   virtual int sync () {
       if (flushBuffer() == EOF) {
           // ERROR
           return -1;
       }
       return 0;
   }

}; int main() {

   outbuf ob;                // create special output buffer
   std::ostream out(&ob);    // initialize output stream with that output buff

er

   out << "31 hexadecimal: " << std::hex << 31 << std::endl;

}</source>

31 hexadecimal: 1f

Extends std::streambuf to create output buffer

<source lang="cpp">/* The following code example is taken from the book

* "The C++ Standard Library - A Tutorial and Reference"
* by Nicolai M. Josuttis, Addison-Wesley, 1999
*
* (C) Copyright Nicolai M. Josuttis 1999.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
  1. include <iostream>
  1. include <streambuf>
  2. include <locale>
  3. include <cstdio>

class outbuf : public std::streambuf {

 protected:
   /* central output function
    * - print characters in uppercase mode
    */
   virtual int_type overflow (int_type c) {
       if (c != EOF) {
           // convert lowercase to uppercase
           c = std::toupper(c,getloc());
           // and write the character to the standard output
           if (putchar(c) == EOF) {
               return EOF;
           }
       }
       return c;
   }

};

int main() {

   outbuf ob;                // create special output buffer
   std::ostream out(&ob);    // initialize output stream with that output buffer
   out << "31 hexadecimal: " << std::hex << 31 << std::endl;

}</source>