C++ filebuf 类
示例
使用 filebuf
对象创建文件
#include <iostream>
#include <fstream>
using namespace std;
int main() {
// Create a file
filebuf MyFileBuf;
MyFileBuf.open("filename.txt", ios_base::out);
// Write into the file
MyFileBuf.sputn("Hello World!", 12);
// Close the file
MyFileBuf.close();
}
定义和用法
filebuf
类用于读写文件。在 fstream
、ifstream
和 ofstream
类内部会使用一个 filebuf
对象。
filebuf
类定义在 <fstream>
头文件中。
文件处理函数
文件处理函数用于打开和关闭文件。
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"; // Displays 0 because the file is not open
MyFileBuf.open("filename.txt");
cout << MyFileBuf.is_open(); << "\n"; // Displays 1 because the file is open
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 移动文件指针到由 offset 指定的某个位置,并返回新位置。
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
数组。此方法返回读取的字符数。
char destination[20];
int amount = MyFileBuf.sgetn(destination, 19);
destination[amount] = '\0'; // Add a null terminating character to the string
cout << destination;
文件写入函数
sputc()
sputc()
方法在当前位置写入一个字符,然后将文件指针向前移动一个字符。此方法返回写入字符的 ASCII 值。
cout << MyFileBuf.sputc();
sputn()
sputn(source, n)
方法将 source 参数指定的 char
数组中的 n 个字符写入文件。文件指针向前移动 n 个字符。此方法返回写入文件的字符数。
char source[] = "Hello World!";
int num = MyFileBuf.sputn(source, 12);
cout << num << " characters were written to the file";