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

📄 stdiostream.c

📁 早期freebsd实现
💻 C
字号:
//    This is part of the iostream library, providing -*- C++ -*- input/output.//    Copyright (C) 1992 Per Bothner.////    This library is free software; you can redistribute it and/or//    modify it under the terms of the GNU Library General Public//    License as published by the Free Software Foundation; either//    version 2 of the License, or (at your option) any later version.////    This library is distributed in the hope that it will be useful,//    but WITHOUT ANY WARRANTY; without even the implied warranty of//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU//    Library General Public License for more details.////    You should have received a copy of the GNU Library General Public//    License along with this library; if not, write to the Free//    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.#ifdef __GNUG__#pragma implementation#endif#include <stdiostream.h>// A stdiobuf is "tied" to a FILE object (as used by the stdio package).// Thus a stdiobuf is always synchronized with the corresponding FILE,// though at the cost of some overhead.  (If you use the implementation// of stdio supplied with this library, you don't need stdiobufs.)// This implementation inherits from filebuf, but implement the virtual// functions sys_read/..., using the stdio functions fread/... instead// of the low-level read/... system calls.  This has the advantage that// we get all of the nice filebuf semantics automatically, though// with some overhead.#ifndef SEEK_SET#define SEEK_SET 0#endif#ifndef SEEK_CUR#define SEEK_CUR 1#endif#ifndef SEEK_END#define SEEK_END 2#endifstdiobuf::stdiobuf(FILE *f) : filebuf(fileno(f)){    _file = f;    // Turn off buffer in stdiobuf.  Instead, rely on buffering in (FILE).    // Thus the stdiobuf will be synchronized with the FILE.    setbuf(NULL, 0);}_G_ssize_t stdiobuf::sys_read(char* buf, size_t size){    return fread(buf, 1, size, _file);}_G_ssize_t stdiobuf::sys_write(const void *buf, long n){    return fwrite(buf, 1, n, _file);    if (_fb._offset >= 0)	_fb._offset += n;}fpos_t stdiobuf::sys_seek(fpos_t offset, _seek_dir dir){    // Normally, equivalent to: fdir=dir    int fdir =	(dir == ios::beg) ? SEEK_SET :        (dir == ios::cur) ? SEEK_CUR :        (dir == ios::end) ? SEEK_END :        dir;    return fseek(_file, offset, fdir);}int stdiobuf::sys_close(){    int status = fclose(_file);    _file = NULL;    return status;}int stdiobuf::sync(){    if (filebuf::sync() == EOF)	return EOF;    if (!(xflags() & _S_NO_WRITES))	if (fflush(_file))	    return EOF;    if (fseek(_file, 0, SEEK_CUR) == EOF)	return EOF;    return 0;}int stdiobuf::overflow(int c /* = EOF*/){    if (filebuf::overflow(c) == EOF)	return EOF;    if (c != EOF)	return c;    return fflush(_file);}int stdiobuf::xsputn(const char* s, int n){    // The filebuf implementation of sputn loses.    return streambuf::xsputn(s, n);}

⌨️ 快捷键说明

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