C++ filebuf 类

定义和用法

filebuf 类用于读写文件。fstreamifstreamofstream 类内部会使用一个 filebuf 对象。

filebuf 类在 <fstream> 头文件中定义。

实例

使用 filebuf 对象创建一个文件:

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    // 创建一个文件
    filebuf MyFileBuf;
    MyFileBuf.open("filename.txt", ios_base::out);
    
    // 写入文件
    MyFileBuf.sputn("Hello World!", 12);
    
    // 关闭文件
    MyFileBuf.close();
}

文件处理函数

文件处理函数用于打开和关闭文件。

open()

open(filepath, mode) 方法打开指定路径 filepath 的文件。如果文件已经打开,则此方法无效。mode 参数是一组标志,指示文件的使用方式。mode 参数可以使用以下标志:

  • ios_base::in - 文件以读取模式打开。
  • ios_base::out - 文件以写入模式打开。
  • ios_base::binary - 文件内容被视为二进制数据,而不是文本。
  • ios_base::ate - 文件打开时,文件指针位于文件末尾。
  • ios_base::app - 新数据总是写入文件末尾。
  • ios_base::trunc - 文件打开时,文件内容被删除。

标志可以使用 | 运算符组合。例如,要同时以读取和写入模式打开文件,可以使用 ios_base::in|ios_base::out

filebuf MyFileBuf;
MyFileBuf.open("filename.txt", ios_base::in|ios_base::out);

is_open()

is_open() 方法返回一个布尔值,如果文件已打开则返回 true,如果未打开文件则返回 false。

filebuf MyFileBuf;
cout << MyFileBuf.is_open() << "\n"; // 显示 0,因为文件未打开
MyFileBuf.open("filename.txt");
cout << MyFileBuf.is_open() << "\n"; // 显示 1,因为文件已打开

close()

close() 方法关闭文件。完成文件操作后关闭文件以释放资源是个好习惯。

MyFileBuf.close();

文件指针函数

文件指针是内部变量,指示在文件中读取或写入的位置。

文件指针函数用于操作文件指针。有读取文件指针和写入文件指针,但对于普通文件,filebuf 类对两者使用相同的指针,因此更改其中一个也会更改另一个。

pubseekpos()

pubseekpos(position, pointer) 方法将文件指针移动到相对于文件开头指定位置,并返回新位置。pointer 属性通过以下标志指定是移动读取指针、写入指针还是两者:

  • ios_base::in - 移动读取指针
  • ios_base::out - 移动写入指针

可以使用 | 运算符组合这两个标志,如下所示:ios_base::in|ios_base::out

cout << MyFileBuf.pubseekpos(4, ios_base::in);

pubseekoff()

pubseekoff(offset, origin, pointer) 方法将文件指针移动到相对于指定原点偏移量指定的位置,并返回新位置。

origin 参数必须是以下值之一:

  • ios_base::beg - 相对于文件开头的偏移量
  • ios_base::cur - 相对于当前文件指针位置的偏移量
  • ios_base::end - 相对于文件末尾的偏移量

pointer 属性通过以下标志指定是移动读取指针、写入指针还是两者:

  • ios_base::in - 移动读取指针
  • ios_base::out - 移动写入指针

可以使用 | 运算符组合这两个标志,如下所示:ios_base::in|ios_base::out

cout << MyFileBuf.pubseekoff(-5, ios_base::end, ios_base::in);

文件读取函数

in_avail()

in_avail() 方法返回文件中可供读取的字符数。

cout << MyFileBuf.in_avail();

snextc()

snextc() 方法将文件指针向前移动一个字符,并返回新位置字符的 ASCII 值。

cout << MyFileBuf.snextc();

sbumpc()

sbumpc() 方法返回当前位置字符的 ASCII 值,并将文件指针向前移动一个字符。

cout << MyFileBuf.sbumpc();

sgetc()

sgetc() 方法返回当前位置字符的 ASCII 值,而不移动文件指针。

cout << MyFileBuf.sgetc();

sgetn()

sgetn(destination, n) 方法从文件中读取 n 个字符,并将它们写入由 destination 参数指定的字符数组中。此方法返回读取的字符数。

char destination[20];
int amount = MyFileBuf.sgetn(destination, 19);
destination[amount] = '\0'; // 向字符串添加空终止字符
cout << destination;

文件写入函数

sputc()

sputc() 方法在当前位置写入一个字符,然后将文件指针向前移动一个字符。此方法返回所写字符的 ASCII 值。

cout << MyFileBuf.sputc();

sputn()

sputn(source, n) 方法将由 source 参数指定的字符数组中的 n 个字符写入文件。文件指针向前移动 n 个字符。此方法返回写入文件的字符数。

char source[] = "Hello World!";
int num = MyFileBuf.sputn(source, 12);
cout << num << " characters were written to the file";