⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mystream.cpp

📁 国外网站上的一些精典的C程序
💻 CPP
字号:
// Mystream.cpp// Implementation of ios interface classes for Myio//// Written by David L. Nugent//# include <iostream.h># include "Mystream.h"# if defined(_MSC_VER)#  include <memory.h># else#  include <stdlib.h># endif    // Mystreambuf constructor    // This simply initialises the base class streambuf    // (it is initially empty with no buffer allocated)    // and register the Myio object    // Note: we _could_ set the stream unbuffered here,    // which is useful for stdio handles, so that the    // streambuf functions overflow() and underflow()    // get called on every character rather than when    // the streambuf buffer is fullMystreambuf::Mystreambuf (Myio * mPtr)    : streambuf (), mptr(mPtr){//  unbuffered(1);  // Uncomment to make unbuffered}    // Mystreambuf()    // Called when streambuf owned buffer is full    // or when stream is flushed    // Our job here is to empty the streambuf    // write buffer and reset the 'put' pointers.intMystreambuf::overflow (int c){    int written;        // Handle unbuffered stream    if (unbuffered())       // Handle the simple case first    {        if (c == EOF)   // Special case, this only flushes            return 0;        char ch = char(c);  // Write the byte directly        written = mptr->write (&ch, 1);        return (written) ? c : EOF;    }        // Handle buffered stream    if (!base())        // Need to allocate a buffer        allocate();    if (base())         // Test for memory allocation error    {        char * ep = base() + (blen() / 2);        if (!pbase())   // Set put pointers if not set up            setp (base(), ep);        int bytes = pptr() - pbase();   // Bytes to write        if (bytes)        {            written = mptr->write (pbase(), bytes);            if (!written)                return EOF;            bytes += written;            if (bytes)  // Some is still waiting to be written                memcpy (base(), base() + written, bytes);        }        setp (base() + bytes, ep);  // Reset 'put' pointers        return (c == EOF) ? 0 : sputc (c);  // Put pending chr in buf    }    return EOF;}    //    // underflow() indicates that the input queue    // is empty and needs more data    //intMystreambuf::underflow (void){    int bytes;        // Handle an unbuffered stream    if (unbuffered())    {        bytes = mptr->read (&_back[1], 1);        if (!bytes)        {            setg (0, 0, 0);            return EOF;        }        setg (_back, _back + 1, _back + 2);        return (unsigned char)_back[1];    }        // Handle a buffered stream    if (!base())        // Need to allocate a buffer        allocate();    if (base())    {        char * gp = base() + blen() / 2;        if (gptr() >= egptr())        {                   // Read into the buffer from stream            overflow ();    // Flush output in case we need it            bytes = mptr->read (gp + 1, blen() / 2 - 1);            setg (gp, gp + 1, gp + bytes + 1);        }        if (gptr() < egptr())   // Get from buffer            return (unsigned char) *gptr();    }    return EOF;}    //    // sync() needs to empty both put and get    // buffered. It will do this by calling    // overflow and simply resetting the get    // pointers to their default location.    //intMystreambuf::sync (void){    if (!unbuffered())    {        overflow ();                // Force output        char * gp = base();        setp (gp, gp + blen() / 2);        gp = base() + blen() / 2;        setg (0, 0, 0);    }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -