在C++中,涉及文件读写的主要类包括ifstream、ofstream 和 fstream。这些类都位于 `<fstream>` 头文件中,并提供了各种方法来进行文件读写操作。
1. ifstream(input file stream):用于从文件中读取数据。
- 打开文件:`ifstream file("filename");`
- 检查文件是否成功打开:`if (!file) { /* 处理打开文件失败的情况 */ }`
- 读取文件内容:`file >> variable;` 或 `getline(file, line);`
- 关闭文件:`file.close();`
2. ofstream(output file stream):用于向文件中写入数据。
- 打开文件:`ofstream file("filename");`
- 检查文件是否成功打开:`if (!file) { /* 处理打开文件失败的情况 */ }`
- 写入数据到文件:`file << data;`
- 关闭文件:`file.close();`
3. fstream(file stream):同时支持读写操作,可以用于读取和写入文件。
- 打开文件:`fstream file("filename");`
- 检查文件是否成功打开:`if (!file) { /* 处理打开文件失败的情况 */ }`
- 读取文件内容:`file >> variable;` 或 `getline(file, line);`
- 写入数据到文件:`file << data;`
- 关闭文件:`file.close();`
以上是文件读写类的基本用法,通过这些类和对应的方法,可以实现对文件的读取和写入操作。在使用这些类时,需要注意文件打开成功与否的检查,以及在使用完文件后关闭文件流,释放资源。
-------------------------------
这行代码用于设置文件流对象
file.rdbuf()->pubsetbuf(buffer, buffer_size);file
的缓冲区大小和位置。
file.rdbuf()
返回文件流对象file
所关联的底层缓冲区指针(streambuf),它是用于管理输入输出的基础设施。pubsetbuf(buffer, buffer_size)
是 streambuf 类的成员函数,用于设置缓冲区的大小和位置。它接受两个参数:一个指向字符数组的指针buffer
,和缓冲区的大小buffer_size
。
这行代码的目的是将文件流对象 file
的缓冲区设置为大小为 buffer_size
的 buffer
数组,以便在写入大量数据时提高效率。通过设置缓冲区,可以减少对底层操作系统的频繁调用,将数据先缓存到内存中,然后批量写入文件,从而提高了写入的效率。
#include <iostream>
#include <fstream>
#include <string>
int main() {
const int buffer_size = 1024; // 设置缓冲区大小为1KB
char buffer[buffer_size]; // 定义缓冲区数组
std::ofstream file("C++_large_output.txt");
if (!file) {
std::cerr << "Error opening file for writing." << std::endl;
return 1;
}
// file.rdbuf() 返回文件流对象 file 的指针指向的基础缓冲区(streambuf),它是用于管理输入输出的基础设施。
// -> 是C++中用于访问对象的成员(成员函数、成员变量)的运算符,通常用于访问指针所指向对象的成员。
file.rdbuf()->pubsetbuf(buffer, buffer_size); // 设置文件流对象 file 的缓冲区的大小和位置的
// 写入大量数据到文件
for (int i = 0; i < 10000; i++) {
file << "Line " << i << std::endl;
}
file.close();
// 创建了一个名为 file 的文件输入流对象,并打开了名为 "C++_large_output.txt" 的文本文件
std::ifstream file2("C++_large_output.txt");
if (!file2) {
std::cerr << "Error opening file." << std::endl;
return 1;
}
std::string line;
int line_count = 0; // 计数器
while (std::getline(file2, line)) {
// 打印前100行文本
if (line_count < 100) {
std::cout << line << std::endl;
line_count++;
} else {
break; // 达到100行后退出循环
}
}
file.close();
return 0;
}