Бьерн Страуструп.
Язык программирования С++
279
public:
streambuf();
streambuf(char* p, int l);
virtual
~streambuf();
int snextc() // получить очередной символ
{
return (++gptr==pptr) ? underflow() : *gptr&0377;
}
int allocate(); // отвести память под буфер
//...
};
Подробности реализации класса streambuf приведены здесь только для полноты представления. Не
предполагается, что есть общедоступные реализации, использующие именно эти имена. Обратите
внимание на определенные здесь указатели, управляющие буфером; с их помощью простые
посимвольные операции с потоком можно определить максимально эффективно (и причем однократно)
как функции-подстановки. Только функции overflow() и underflow() требует своей реализации для
каждого алгоритма буферизации, например:
class filebuf : public streambuf {
protected:
int fd; //
дескриптор файла
char opened; // признак открытия файла
public:
filebuf() { opened = 0; }
filebuf(int nfd, char* p, int l)
: streambuf(p,l) { /* ... */ }
~filebuf() { close(); }
int
overflow(int
c=EOF);
int
underflow();
filebuf* open(char *name, ios::open_mode om);
int close() { /* ... */ }
//...
};
int filebuf::underflow() //
заполнить буфер из "fd"
{
if (!opened || allocate()==EOF) return EOF;
int count = read(fd, base, eptr-base);
if (count < 1) return EOF;
gptr = base;
pptr = base + count;
return *gptr & 0377; // &0377 предотвращает размножение знака
}
За дальнейшими подробностями обратитесь к руководству по реализации класса streambuf.
Достарыңызбен бөлісу: