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

📄 myio.cpp

📁 国外网站上的一些精典的C程序
💻 CPP
字号:
// Myio.cpp// Simple I/O class to demonstrate use of C++ iostream// facilities in a customised environment// Written by David L Nugent, June 1993# include <iostream.h># include <string.h># include "Myio.h"# include "Mystream.h"Myio::Myio (int sz)    : bufsize(sz), bufchars(0), bufidx(0),      bufaddr(new char[bufsize]), mystream(0){}Myio::~Myio (void){    delete bufaddr;    delete mystream;}iostream &Myio::stream (void){    if (!mystream)      // Create a stream if required        mystream = new Mystream(this);    return *mystream;}int         // Simple write function into a circular bufferMyio::write (char const * buf, int len){    int avail = (bufsize - bufchars);   // See how many fit    if (len > avail)    {        len = avail;        stat |= Myio::overflow;         // Only partial write    }    else        stat &= ~Myio::overflow;    avail = bufsize - bufidx;           // Calculate room at end    if (avail > len)        avail = len;    if (avail)    {        memcpy (bufaddr + bufidx, buf, avail);        bufidx += avail;                // Update the put index        buf += avail;                   // And the input pointer    }    if (bufidx >= bufsize)              // Wrap buffer to start        bufidx = 0;    avail = len - avail;                // See if there is any more to go    if (avail)    {        memcpy (bufaddr + bufidx, buf, avail);        bufidx += avail;                // Update the put index    }    bufchars += len;    return (_pcount = len);}int         // Simple read function from a circular bufferMyio::read (char * buf, int len){    if (len > bufchars)                 // Adjust for available bytes    {        len = bufchars;        stat |= Myio::underflow;        // Got an underflow (partial read)    }    else        stat &= ~Myio::underflow;       // Clear underflow flag    int startidx = bufidx - bufchars;   // Determine start get position    if (startidx < 0)        startidx += bufsize;            // Adjust for wrap    int avail = bufsize - startidx;     // Check room at end of buffer    if (avail > len)                    // Adjust down if necessary        avail = len;    if (avail)                          // Copy first section    {        memcpy (buf, bufaddr + startidx, avail);        startidx += avail;              // Adjust start index        buf += avail;                   // Adjust output pointer    }    if (startidx >= bufsize)            // Wrap buffer to start        startidx = 0;    avail = len - avail;                // See if there is any more to go    if (avail)                          // If so, copy the rest        memcpy (buf, bufaddr + startidx, avail);    bufchars -= len;                    // Adjust character count    return (_gcount = len);}Myio &operator<< (Myio & m, char const * ptr){    m.write (ptr, strlen (ptr));    return m;}intMyio::dump (void) const{    if (bufchars)    {        char * tmp = new char[bufchars + 2];        int idx = bufidx - bufchars;	  int i;	  if (idx < 0)            idx += bufsize;        for (i = 0; i < bufchars; )        {            if (idx >= bufsize)                idx = 0;            tmp[i++] = bufaddr[idx++];        }        if (i)        {            if (tmp[i-1] != '\n')   // Terminate with NL                tmp[i++] = '\n';            tmp[i] = 0;            cout << "---\n"                 << tmp                 << "---\n";        }        delete tmp;    }    return bufchars;}

⌨️ 快捷键说明

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