C++ 竞赛入门

文件操作(选读)

文件操作(选读)

本节学会什么

  • 区分标准输入输出与文件输入输出
  • 在题目明确要求时用 freopen 重定向输入输出
  • 在本地用重定向测试程序

为什么需要它

这是一篇选读工具课。快速入门的普通 OJ 题都使用标准输入输出;跳过本页不会影响后续学习。

洛谷等在线评测默认把测试数据接到标准输入、把答案接到标准输出,因此平时使用 cincout 就够了。少数传统比赛题会明确指定输入、输出文件名,这时才需要把标准输入输出连接到文件。

最小可运行示例

题目若明确要求从 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" 表示写文件。运行后,程序仍然使用 cincout,只是它们连接到了文件;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