汪柴宁

已结束 XCPC 开始于: 2025-12-17 20:00 8 小时 主持人: 3

开始之前必须把这个学会

文件读写

https://www.yuque.com/_yezi/csp/ex44dgdiflultgaf?singleDoc# 语雀链接

一、核心要求

CSP-J复赛程序禁止使用控制台输入输出,必须从指定.in文件读取输入数据,将结果写入指定.out文件。

二、推荐方案(freopen重定向,首选)

1. 核心函数:freopen()

作用:重定向标准输入(stdin)/输出(stdout),让cin/cout/scanf/printf直接读写文件。

// 输入重定向:从xxx.in读数据(只读模式)
freopen("文件名.in", "r", stdin);
// 输出重定向:向xxx.out写数据(只写模式,不存在则创建,存在则清空)
freopen("文件名.out", "w", stdout);

2. 完整模板(直接套用)

#include <iostream>
using namespace std;

int main() {
    // 1. 重定向文件(替换为题目指定的文件名!)
    freopen("problem.in", "r", stdin);
    freopen("problem.out", "w", stdout);

    // 2. 核心逻辑(和控制台写法完全一致)
    int a, b;
    cin >> a >> b; // 从.in文件读
    cout << a + b << endl; // 向.out文件写

    // 3. 可选:关闭文件(程序结束自动关闭,比赛可省略)
    fclose(stdin);
    fclose(stdout);
    return 0;
}

3. 关键说明

  • 重定向后,cin/cout/scanf/printf用法无需任何修改
  • 文件名必须和题目要求完全一致(如calc.in/calc.out),多空格/错字母直接零分。

三、备用方案(fstream流,了解即可)

#include <iostream>
#include <fstream> // 必须包含头文件
using namespace std;

int main() {
    ifstream fin("problem.in");  // 输入文件流
    ofstream fout("problem.out"); // 输出文件流

    // 核心逻辑:用fin代替cin,fout代替cout
    int a, b;
    fin >> a >> b;
    fout << a + b << endl;

    fin.close(); // 关闭文件流
    fout.close();
    return 0;
}

四、必记注意事项

  1. 调试/比赛切换
    • 本地调试:注释freopen行,用控制台输入输出测试;
    • 提交前:务必取消注释,确保文件重定向生效。
  2. 兼容性freopen方案兼容C/C++写法,无需额外头文件,比fstream更简洁。
  3. 无需手动关闭:程序结束后系统会自动关闭文件流,比赛中省略fclose不影响结果。

五、核心总结

  1. 优先用freopen()重定向stdin/stdout,代码简洁不易错;
  2. 文件名是“生死线”,必须严格匹配题目要求;
  3. 重定向后核心逻辑写法和控制台完全一致,无需改动。
状态
已结束
规则
XCPC
题目
11
开始于
2025-12-17 20:00
结束于
2025-12-18 4:00
持续时间
8 小时
主持人
参赛人数
3