C++ 竞赛入门
文件操作(选读)
文件操作(选读)
本节学会什么
- 区分标准输入输出与文件输入输出
- 在题目明确要求时用
freopen重定向输入输出 - 在本地用重定向测试程序
为什么需要它
这是一篇选读工具课。快速入门的普通 OJ 题都使用标准输入输出;跳过本页不会影响后续学习。
洛谷等在线评测默认把测试数据接到标准输入、把答案接到标准输出,因此平时使用 cin 和 cout 就够了。少数传统比赛题会明确指定输入、输出文件名,这时才需要把标准输入输出连接到文件。
最小可运行示例
题目若明确要求从 sum.in 读入、写入 sum.out,可以这样写:
#include <cstdio>
#include <iostream>
int main() {
std::freopen("sum.in", "r", stdin);
std::freopen("sum.out", "w", stdout);
int a, b;
std::cin >> a >> b;
std::cout << a + b << '\n';
return 0;
}
"r" 表示读文件,"w" 表示写文件。运行后,程序仍然使用 cin、cout,只是它们连接到了文件;sum.out 若已存在会被覆盖。
关键过程与易错点
- 只在题面明确给出文件名时使用
freopen。提交普通 OJ 题时保留它会导致读不到数据或没有输出。 - 文件名、大小写和扩展名必须与题面完全一致。Linux 服务器区分大小写。
"w"会清空原文件,调试时不要把重要文件当作输出文件。- 本地临时测试普通程序时,也可在终端使用
./program < input.txt > output.txt,不需要修改源代码。 - 现代 CSP/NOIP 具体是否使用文件由当年题面与比赛环境决定,开赛前以官方说明为准。
动手检查
创建 sum.in,其中写入 3 5。编译并运行示例,查看 sum.out 是否只有 8。然后注释两条 freopen,改用终端重定向完成同一个测试。
故意将输入文件名改错一次,观察程序不再得到正常数据;改回后确认结果恢复。
立即练习
| 难度 | 题目 | 题解 | 训练目标 |
|---|---|---|---|
| 基础 | 洛谷 P1001:A+B Problem | 题解 | 先使用标准输入输出完成,再在本地用重定向测试。 |
| 巩固 | 洛谷 P1421:小玉买文具 | 题解 | 练习从题面判断是否需要文件读写;本题不应提交 freopen。 |