GESP 四级 · GESP 202503 C++ 四级 第 15 题

选择题 · 答案 C

← 整套速查表 GESP 四级 全部真题

题目

下面哪种方式不能实现将字符串 "Happy Spring!" 输出重定向到文件 log.txt ( )。

A.

freopen("log.txt", "w", stdout);
cout << "Happy Spring!" << endl;
fclose(stdout);

B.

std::ofstream outFile("log.txt");
outFile << "Happy Spring!" << endl;
outFile.close();

C.

std::ofstream outFile("log.txt");
cout << "Happy Spring!" << endl;
outFile.close();

D.

ofstream log_file("log.txt");
streambuf* org_cout = cout.rdbuf();
cout.rdbuf(log_file.rdbuf());
cout << "Happy Spring!" << endl;
cout.rdbuf(org_cout);
答案:C

解题思维

答案C。指针和数组的代码追踪:画出变量和指针的内存示意图,追踪每次赋值后值的变化。

常见错误

指针和数组追踪时画内存布局图可以大大简化理解。

详细解析(节选)

【考点】文件流操作|freopen 重定向|流缓冲区重绑定

命题人卡住的是"以为开了 ofstream 就能改 cout"的幻觉,四级核心就是掌握 freopen 和 rdbuf 两招。

A 项 freopen 把 stdout 绑定到 log.txt,cout 自然走文件;B 用 ofstream 直接写文件;D 通过 rdbuf 临时切换 cout 的缓冲区,输出时走文件;C 只声明 ofstream 却从未调用其 insert 运算符,cout 仍走控制台,天然无法重定向。

陷阱 1:误以为对象构造即生效——C 项考的就是"未使用对象"的无效性;陷阱 2:混淆 freopen 与 ofstream——A 项用 freopen 是标准重定向,B 项用 ofstream 是文件流,两者都能改输出,但 C 项连文件流都没用;陷阱 3:忽视 rdbuf 的临时性——D 项先保存 org_cout 再改回,若漏掉恢复就会污染标准输出,这是命题人埋的"忘记恢复"坑。

命题人视角:若把 C 项改成"ofstream outFile 且 outFile 实际写入",答案就变成"所有都能重定向",考察点就偏了;若问"哪种方式不重定向但使用了文件",答案会是 C,但题干要求"不能实现重定向",所以 C 是唯一符合。

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断