考纲要求
- 理解重定向的作用:把标准输入输出接到文件,程序仍然用 cin 和 cout 读写。
- 掌握 freopen 的用法,知道打开模式 r、w 的含义以及打开失败时要检查。
- 了解 ifstream 与 ofstream 的基本用法,能逐行或逐个数据读写文本文件。
- 理解文件读完的判断方式,避免多读一次或漏读最后一个数据。
典型题型
- 补全 freopen 语句,使程序从指定文件读入、输出到指定文件。
- 读入文件中的若干行文本并统计。
- 判断文件打开失败时的表现。
常见错误
- freopen 的路径写错导致读不到数据,程序读到的全是默认值。
- 用 w 模式打开已有输入文件,把原内容清空。
- 循环读取时判断方式不当,文件末尾多处理一次或漏掉最后一个数据。
- 读写文件后忘记关闭,或者在同一程序中重复以写模式打开同一文件。
深入理解
两种做法:重定向与文件流
重定向只改一行代码,把 cin、cout 的流向换到文件上:
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);加在 main 开头即可,之后所有 cin、cout 自动读写文件,其余代码完全不用改。文件流则显式声明对象:
ifstream fin("in.txt");
ofstream fout("out.txt");
int x; fin >> x; fout << x;两者的区别是重定向影响所有输入输出,文件流只影响自己那个对象,可以同时读写多个文件。
打开模式写错会清空数据
常用模式:"r" 只读、"w" 只写(文件存在时先清空)、"a" 追加、"r+" 读写。最危险的是 "w":本来想读一个已有文件,模式误写成 "w",打开的一瞬间内容就被清空了。
追加模式 "a" 是唯一不会破坏已有内容的写入方式。ofstream 默认就是 "w",ifstream 默认是 "r",忘了指定模式时要按默认值考虑。
读不到数据先查三处
文件读出来是空的或者全是默认值,按顺序查:文件名与路径是否正确(相对路径以程序运行目录为准,不是源文件所在目录)、打开模式是否匹配(想读却用了写模式)、文件是否真的存在。
稳妥的写法是打开后判断一下:if (!fin) { cout << "open failed"; return 1; }。另外,循环读文件常用 while (fin >> x),读到文件末尾时返回 false 自动停止,比用 eof() 少一次重复读取的错误。
自编例题
用 freopen 完成文件读写
编写程序从 data.in 读入 n 个整数求和,把结果写入 data.out。
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
int n, x, sum = 0;
cin >> n;
for (int i = 0; i < n; i++) { cin >> x; sum += x; }
cout << sum << endl;两条 freopen 语句把标准输入输出分别接到文件,之后程序里的 cin 和 cout 不需要任何修改,读写目标自动变成文件。打开模式 r 表示只读,文件必须已经存在;w 表示写入,文件不存在会新建,存在则清空。考试中会明确给出文件名,提交时要确认路径与文件名完全一致。重定向之后不能再从键盘读入,调试时要注意这一点。
相关真题
这块内容在整条路线里的位置:GESP C++ 4 级备考路径。
READY TO START
开始练习
先做一套本级别测评,报告会指出哪些知识点需要重点补;再回到本页对照考纲要求逐条核对,把不确定的条目记下来集中练。
常见问题
重定向和文件流哪个更好?
重定向写法简单,适合只想改输入输出源的题目;文件流更灵活,可以同时打开多个文件,适合需要读写多个文件的场景。
freopen 打开失败怎么办?
会返回空指针,标准输入输出保持原状或不可用。应先检查文件是否存在、路径是否正确、权限是否足够。
文件读写要注意什么?
注意打开模式、文件名拼写和关闭操作;循环读取要正确处理文件末尾,避免多读一次或漏读最后一个数据。
