#include <fstream.h> typedef long streampos; typedef long streamoff; class ios : virtual public unsafe_ios, public stream_MT { public: enum open_mode { in = 0x01, // open for reading out = 0x02, // open for writing ate = 0x04, // seek to eof upon original open app = 0x08, // append mode: all additions at eof trunc = 0x10, // truncate file if already exists nocreate = 0x20, // open fails if file doesn't exist noreplace= 0x40 // open fails if file already exists };
enum seek_dir { beg=0, cur=1, end=2 };
// see ios(3CC4) for remainder ... };
class filebuf : public streambuf { public: static const int openprot ; /* default protection for open */
filebuf() ; ~filebuf() ; filebuf(int f); filebuf(int f, char* p, int len) ;
filebuf* attach(int f) ; filebuf* attach_unlocked(int); filebuf* close(); filebuf* close_unlocked(); int detach() ; int detach_unlocked(); int fd(); int is_open(); int is_open_unlocked(); filebuf* open(char *name, int omode, int prot=openprot) ; filebuf* open_unlocked(const char*, int, int=filebuf::openprot); streampos seekoff(streamoff, seek_dir, int omode) ; streampos seekpos(streampos, int omode) ; streambuf* setbuf(char* p, int len) ; int sync() ; };
filebuf 类是 streambuf 的特例,使用文件作为字符的来源或目的地。将从文件中获取(输入)字符并且字符将由文件使用(写入到其中)。当 filebuf 连接(附加)到打开的文件时,我们说 filebuf 处于打开状态;否则,我们说它处于关闭状态。缺省情况下,文件在保护模式 filebuf::openprot(即 0666)下打开。
如果附加的文件是可查找的,则 filebuf 允许查找;例如,普通磁盘文件是可查找的,终端不是。如果附加的文件允许读取(写入),则 filebuf 允许获取(存储);例如,标准输入仅允许读取,标准输出仅允许写入。与 C stdio 不同,不需要在针对同一 filebuf 的获取和放置之间进行查找。最初允许最少四个字符的放回。
sbufprot3CC4() 和 sbufpub3CC4() 中描述了基本的 streambuf 操作。如果未向构造函数提供保留区或未调用 setbuf(通常会调用 setbuf),则会自动分配保留区。如果使 filebuf 成为无缓冲的,则每个输入和输出字符都需要一次系统调用。get 和 put 指针的行为像单个指针一样;从概念上来讲,它们绑定在一起。
filebuf 通过 Unix 文件描述符(一个在系统调用中传递的小整数)对文件进行操作。不使用 C stdio。注意:不会检查所提供的文件描述符是否有效。
多个成员函数是以两种版本定义的:一种为“非安全”版本(后缀为 _unlocked),此版本未针对多线程访问提供保护;另一种为“安全”版本,此版本(缺省版本)使用互斥锁针对多个线程的同时访问提供保护。
创建关闭的 filebuf。
创建一个附加到文件描述符 f(它被假定为处于打开状态)的打开 filebuf。
创建一个附加到文件描述符 f(它被假定为处于打开状态)的打开 filebuf。使用开头为 p 的 len char 数组作为初始保留区。如果 p 为零或者 len 不大于零,则 filebuf 是无缓冲的。
如果 fbuf 是关闭的,则会将其连接到文件描述符 f(假定处于打开状态)并返回 fbuf 的地址。如果 fbuf 已打开,则会忽略 f 并返回零。此成员是多线程安全的。
功能与 attach 相同,但是它不执行任何互斥锁,因此不是多线程安全的。
将正在等待的任何输出刷新到与文件描述符关联的文件,并且断开文件描述符与 f 的连接。将返回文件描述符。不希望 close() 关闭附加的文件描述符的应用程序在 close() 之前应当调用此函数。此成员是多线程安全的。
功能与 detach 相同,但是它不执行任何互斥锁,因此不是多线程安全的。
刷新任何未决的输出,无条件地关闭文件描述符并关闭 fbuf。在发生错误时返回零,否则,返回 fbuf 的地址。此成员是多线程安全的。
功能与 close 相同,但是它不执行任何互斥锁,因此不是多线程安全的。
返回附加到 fbuf 的文件描述符,如果 fbuf 未打开,则返回 EOF。
如果 fbuf 已打开(已连接到文件描述符),则返回非零值,否则返回零。此成员是多线程安全的。
功能与 is_open 相同,但是它不执行任何互斥锁,因此不是多线程安全的。
如果 fbuf 尚未打开,则此函数将打开文件 name 并将其文件描述符连接到 fbuf;否则将发生错误。如果文件不存在,并且未在 mode 中设置 ios::nocreate,则 open 将尝试使用 prot 中指定的保护位(缺省值为 0666)创建文件。mode 参数是来自 ios::open_mode 的位的集合,在 fstream(3CC4) 中进行了描述,可以通过 or 运算符连接在一起。此函数在成功时返回 fbuf 的地址,在发生任何错误时都将返回零。此成员是多线程安全的。
功能与 open 相同,但是它不执行任何互斥锁,因此不是多线程安全的。
如 sbufpub(3CC4) 中所述将组合的 get/put 指针移动 off 和 dir,但是会忽略 mode 参数。如果 fbuf 未打开,如果附加的文件不支持查找,或者因为其他原因无法执行查找(例如处于关闭状态或者位于文件末尾),则操作将失败。off 是相对于 dir 指定的文件位置的偏移。在成功时返回新的文件位置,在失败时返回 EOF。发生错误时文件的位置为未定义。
等效于 fbuf.seekoff((streamoff)pos, ios::beg, mode) 调用。pos 的值应当是从之前的 seekoff 或 seekpos 调用获取的值,或者是表示文件开头的值零。另请参见 sbufpub(3CC4)。
如果 fbuf 已打开并且已分配了保留区,则不会进行更改并且 setbuf 将返回零。否则,新保留区将成为开头位于由 p 指向的位置的 len char,并且此函数将返回 fbuf 的地址。如果 p 为零或者 len 不大于零,则不会有储存区并且 fbuf 是无缓冲的。
尝试使 get/put 指针与所附加文件的实际位置协调一致(同步)。这可能涉及刷新未写入的字符或者通过已输入的字符备份文件。在成功时返回零,在发生错误时返回 EOF。如果需要确保将一组字符同时写入某个文件,请分配比最大的此类组更大的保留区,在存储字符之前进行同步,然后在存储之后再次进行同步。
fstream(3CC4)、ios(3CC4)、ios.intro(3CC4)、sbufprot(3CC4)、sbufpub(3CC4)、stream_locker(3CC4)、stream_MT(3CC4)
《C++ Library Reference》中的第 3 章 "The Classic iostream Library" 和第 4 章 "Using Classic iostreams in a Multithreaded Environment"。
UNIX 通常不报告查找故障,因此 filebuf 也不报告。