C++ filebuf 类
定义和用法
filebuf
类用于读写文件。fstream
、ifstream
和 ofstream
类内部会使用一个 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";