Oracle Solaris Studio 12.4 Man Pages

Exit Print View

Updated: January 2015
 
 

filebuf(3CC4)

Name

filebuf - 文件 I/O 的缓冲区类

Synopsis

 
#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() ;
};

Description

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()

创建关闭的 filebuf

filebuf(f)

创建一个附加到文件描述符 f(它被假定为处于打开状态)的打开 filebuf

filebuf(f, p, len)

创建一个附加到文件描述符 f(它被假定为处于打开状态)的打开 filebuf。使用开头为 plen char 数组作为初始保留区。如果 p 为零或者 len 不大于零,则 filebuf 是无缓冲的。

成员函数

filebuf* fb = fbuf.attach(f)

如果 fbuf 是关闭的,则会将其连接到文件描述符 f(假定处于打开状态)并返回 fbuf 的地址。如果 fbuf 已打开,则会忽略 f 并返回零。此成员是多线程安全的。

filebuf *fb = fbuf.attach_unlocked(f)

功能与 attach 相同,但是它不执行任何互斥锁,因此不是多线程安全的。

int i = fbuf.detach()

将正在等待的任何输出刷新到与文件描述符关联的文件,并且断开文件描述符与 f 的连接。将返回文件描述符。不希望 close() 关闭附加的文件描述符的应用程序在 close() 之前应当调用此函数。此成员是多线程安全的。

int i = fbuf.detach_unlocked()

功能与 detach 相同,但是它不执行任何互斥锁,因此不是多线程安全的。

filebuf* fb = fbuf.close()

刷新任何未决的输出,无条件地关闭文件描述符并关闭 fbuf。在发生错误时返回零,否则,返回 fbuf 的地址。此成员是多线程安全的。

filebuf* fb = fbuf.close_unlocked()

功能与 close 相同,但是它不执行任何互斥锁,因此不是多线程安全的。

int f = fbuf.fd()

返回附加到 fbuf 的文件描述符,如果 fbuf 未打开,则返回 EOF

int i = fbuf.is_open()

如果 fbuf 已打开(已连接到文件描述符),则返回非零值,否则返回零。此成员是多线程安全的。

int i = fbuf.is_open_unlocked()

功能与 is_open 相同,但是它不执行任何互斥锁,因此不是多线程安全的。

filebuf* fb = fbuf.open(name, mode, prot)

如果 fbuf 尚未打开,则此函数将打开文件 name 并将其文件描述符连接到 fbuf;否则将发生错误。如果文件不存在,并且未在 mode 中设置 ios::nocreate,则 open 将尝试使用 prot 中指定的保护位(缺省值为 0666)创建文件。mode 参数是来自 ios::open_mode 的位的集合,在 fstream(3CC4) 中进行了描述,可以通过 or 运算符连接在一起。此函数在成功时返回 fbuf 的地址,在发生任何错误时都将返回零。此成员是多线程安全的。

filebuf* fb = fbuf.open_unlocked(name, mode, prot)

功能与 open 相同,但是它不执行任何互斥锁,因此不是多线程安全的。

streampos pos2 = fbuf.seekoff(off, dir, mode)

sbufpub(3CC4) 中所述将组合的 get/put 指针移动 offdir,但是会忽略 mode 参数。如果 fbuf 未打开,如果附加的文件不支持查找,或者因为其他原因无法执行查找(例如处于关闭状态或者位于文件末尾),则操作将失败。off 是相对于 dir 指定的文件位置的偏移。在成功时返回新的文件位置,在失败时返回 EOF。发生错误时文件的位置为未定义。

streampos pos2 = fbuf.seekpos(pos, mode)

等效于 fbuf.seekoff((streamoff)pos, ios::beg, mode) 调用。pos 的值应当是从之前的 seekoffseekpos 调用获取的值,或者是表示文件开头的值零。另请参见 sbufpub(3CC4)。

streambuf* sb = fbuf.setbuf(p, len)

如果 fbuf 已打开并且已分配了保留区,则不会进行更改并且 setbuf 将返回零。否则,新保留区将成为开头位于由 p 指向的位置的 len char,并且此函数将返回 fbuf 的地址。如果 p 为零或者 len 不大于零,则不会有储存区并且 fbuf 是无缓冲的。

int i = fbuf.sync()

尝试使 get/put 指针与所附加文件的实际位置协调一致(同步)。这可能涉及刷新未写入的字符或者通过已输入的字符备份文件。在成功时返回零,在发生错误时返回 EOF。如果需要确保将一组字符同时写入某个文件,请分配比最大的此类组更大的保留区,在存储字符之前进行同步,然后在存储之后再次进行同步。

See also

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"。

Warnings

UNIX 通常不报告查找故障,因此 filebuf 也不报告。