📘 文件读写

2026-08-23
⭐⭐ GESP 5级

📖 概念讲解

文件读写是 C++ 操作文件 I/O 的能力,属于 数据持久化 类考点。GESP 考试中常考 ifstream(读文件)和 ofstream(写文件),偶尔涉及 fstream 同时读写。

核心机制很简单:打开文件 → 操作 → 关闭文件。但有几个坑:文件路径用字符串表示(注意斜杠方向)、打开后必须检查是否成功、用完必须关闭(或等作用域结束自动关闭)。

⚠️ 易错点:Windows 下路径用 \\ 或 / 都行,但 \ 本身是转义字符,直接写 "C:\test.txt" 会出错!必须写 "C:\\test.txt" 或 "C:/test.txt"。

💻 代码示例

1#include <iostream>
2#include <fstream> // 文件流头文件,必须加
3#include <string>
4using namespace std;
5
6int main() {
7 // === 写文件 ===
8 ofstream out("data.txt"); // 创建输出流,打开 data.txt
9 if (!out.is_open()) { // 必须检查是否打开成功
10 cerr << "写入失败!" << endl;
11 return 1; // 打不开就直接退出
12 }
13 out << 100 << endl; // 写入一个整数
14 out << "hello" << endl; // 写入一个字符串
15 out.close(); // 写完记得关闭
16
17 // === 读文件 ===
18 ifstream in("data.txt"); // 创建输入流,读 data.txt
19 int num; string s;
20 in >> num; // 读整数,空格/换行自动跳过
21 in >> s; // 读字符串,遇到空格停止
22 cout << num << " " << s << endl;
23 // 输出: 100 hello
24 in.close();
25 return 0;
26}

🧩 互动小测

Q1:下面哪个头文件是文件读写必须包含的?

Q2:ifstream 对象读取文件失败(文件不存在),哪个方法可以检测?

Q3:下面的代码读取文件内容,文件内容为 "abc 123 xyz",执行后 a、b 的值分别是?
ifstream in("f.txt"); string a; int b; in >> a >> b;

🏋️ 动手练一练

📝 编程练习

从文件 numbers.txt 读取若干整数(每行一个,不知道有多少个),输出这些整数的总和和平均值。

提示:用 while (in >> x) 可以一直读到文件末尾。
参考答案:
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ifstream in("numbers.txt");
    int x, sum = 0, cnt = 0;  // cnt记录读入的整数个数
    while (in >> x) {  // 读到文件末尾时自动退出
        sum += x;       // 累加每个整数
        cnt++;          // 计数
    }
    if (cnt > 0) {
        cout << "总和: " << sum << endl;
        cout << "平均值: " << (double)sum / cnt << endl;
    } else {
        cout << "文件为空" << endl;
    }
    return 0;
}
// 输入文件 numbers.txt: 10 20 30
// 输出: 总和: 60 平均值: 20

要点:while (in >> x) 是文件读取的惯用写法——当读到文件末尾或格式不匹配时,流状态变为 false,循环自动终止。

📝 易错点提醒

学完这个知识点后点一下