josuttis.de - input streambuf



  • dieser Code:

    class fdinbuf : public std::streambuf {
      protected:
        int fd;    // file descriptor
      protected:
        /* data buffer:
         * - at most, pbSize characters in putback area plus
         * - at most, bufSize characters in ordinary read buffer
         */
        static const int pbSize = 4;        // size of putback area
        static const int bufSize = 1024;    // size of the data buffer
        char buffer[bufSize+pbSize];        // data buffer
    
      public:
        /* constructor
         * - initialize file descriptor
         * - initialize empty data buffer
         * - no putback area
         * => force underflow()
         */
        fdinbuf (int _fd) : fd(_fd) {
            setg (buffer+pbSize,     // beginning of putback area
                  buffer+pbSize,     // read position
                  buffer+pbSize);    // end position
        }
    
      protected:
        // insert new characters into the buffer
        virtual int_type underflow () {
    #ifndef _MSC_VER
            using std::memmove;
    #endif
    
            // is read position before end of buffer?
            if (gptr() < egptr()) {
                return traits_type::to_int_type(*gptr());
            }
    
            /* process size of putback area
             * - use number of characters read
             * - but at most size of putback area
             */
            int numPutback;
            numPutback = gptr() - eback();
            if (numPutback > pbSize) {
                numPutback = pbSize;
            }
    
            /* copy up to pbSize characters previously read into
             * the putback area
             */
            memmove (buffer+(pbSize-numPutback), gptr()-numPutback,
                    numPutback);
    
            // read at most bufSize new characters
            int num;
            num = read (fd, buffer+pbSize, bufSize);
            if (num <= 0) {
                // ERROR or EOF
                return EOF;
            }
    
            // reset buffer pointers
            setg (buffer+(pbSize-numPutback),   // beginning of putback area
                  buffer+pbSize,                // read position
                  buffer+pbSize+num);           // end of buffer
    
            // return next character
            return traits_type::to_int_type(*gptr());
        }
    };
    

    Kann mir jemand erklären, was es mit dieser putback-area auf sich hat?
    Wieso schreibt er nicht einfach den Buffer von vorne bis hinten voll?
    Steh irgendwie auf dem Schlauch 😕 (Hab selber eine Test-Implementation gemacht, in der ich kein "putback" verwendet hab und hat so weit ich gesehen hab prima funktioniert)


Anmelden zum Antworten