在上一篇中,我们学习了如何使用 C++ 进行文件的读取与写入。接下来,我们将进一步探讨文件流的使用,这是处理文件操作的核心概念。文件流为我们提供了一种高级的方法来处理文件,不论是文本文件还是二进制文件。
文件流的基本概念
在 C++ 中,文件流是通过 fstream
类来实现的。C++ 提供了三种基本的文件流类型:
ifstream
:输入文件流,用于从文件读取数据。
ofstream
:输出文件流,用于向文件写入数据。
fstream
:双向文件流,既可以读取也可以写入。
引入文件流库
在使用文件流之前,我们需要包含相应的头文件:
1 2 3
| #include <fstream> #include <iostream> #include <string>
|
创建文件流对象
下面是一个简单的示例,展示如何创建文件流对象并打开文件:
1 2 3 4 5 6 7 8 9 10 11 12 13
| std::ifstream inputFile("example.txt"); std::ofstream outputFile("output.txt");
if (!inputFile) { std::cerr << "无法打开输入文件" << std::endl; return 1; }
if (!outputFile) { std::cerr << "无法打开输出文件" << std::endl; return 1; }
|
文件流的读写操作
写入数据到文件
我们可以使用输出文件流 (ofstream
) 将数据写入文件。以下是将字符串写入文件的示例:
1 2 3
| std::string data = "Hello, World!"; outputFile << data; outputFile.close();
|
从文件读取数据
使用输入文件流 (ifstream
) 读取数据非常简单。下面是从文件读取内容的示例:
1 2 3 4 5
| std::string line; while (std::getline(inputFile, line)) { std::cout << line << std::endl; } inputFile.close();
|
文件流的格式化操作
文件流还支持格式化输出。我们可以控制输出内容的格式,如设置精度、宽度等。例如:
1 2 3 4
| #include <iomanip>
double pi = 3.14159265358979323846; outputFile << std::fixed << std::setprecision(2) << pi;
|
错误处理与流状态
在处理文件流时,确保文件的打开和读写成功是至关重要的。C++ 提供了方法检查流的状态,比如 .good()
、.fail()
和 .eof()
:
1 2 3
| if (inputFile.fail()) { std::cerr << "读取文件失败" << std::endl; }
|
案例:写入并读取学生信息
下面是一个完整的案例,展示如何使用文件流来写入和读取学生的信息。
写入学生信息到文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| struct Student { std::string name; int age; };
void writeStudents(const std::string& filename) { std::ofstream outputFile(filename); if (!outputFile) { std::cerr << "无法打开输出文件" << std::endl; return; }
Student students[] = {{"Alice", 20}, {"Bob", 21}, {"Charlie", 22}}; for (const auto& student : students) { outputFile << student.name << " " << student.age << std::endl; } outputFile.close(); }
|
从文件读取学生信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void readStudents(const std::string& filename) { std::ifstream inputFile(filename); if (!inputFile) { std::cerr << "无法打开输入文件" << std::endl; return; }
std::string name; int age; while (inputFile >> name >> age) { std::cout << "姓名: " << name << ", 年龄: " << age << std::endl; } inputFile.close(); }
|
主函数
1 2 3 4 5 6
| int main() { const std::string filename = "students.txt"; writeStudents(filename); readStudents(filename); return 0; }
|
在这个案例中,我们定义了一个 Student
结构体,用于存储学生的姓名和年龄。我们通过 writeStudents
函数将学生信息写入文件,并通过 readStudents
函数从文件读取并输出这些信息。
结束语
本篇教程中,我们学习了 C++ 中的文件流的使用,了解了如何创建、读取和写入文件流。下一篇将带你深入探索 文本文件与二进制文件 的区别以及如何在 C++ 中处理它们。希望你能够继续保持学习热情,逐步掌握 C++ 编程的奥秘!