GESP 四级 · GESP 202412 C++ 四级 第 14 题

选择题 · 答案 C

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

题目

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

A.

freopen("log.txt", "w", stdout);
cout << "Welcome to GESP!" << endl;
fclose(stdout);

B.

std::ofstream outFile("log.txt");
outFile << "Welcome to GESP!" << endl;
outFile.close();

C.

std::ofstream outFile("log.txt");
cout << "Welcome to GESP!" << endl;
outFile.close();

D.

ofstream log_file("log.txt");
streambuf* org_cout = cout.rdbuf();
cout.rdbuf(log_file.rdbuf());
cout << "This output will go to the log file." << endl;
cout.rdbuf(org_cout);
答案:C

解题思维

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

常见错误

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

详细解析(节选)

【考点】文件流|缓冲指针|重定向

GESP四级文件I/O模块的压轴题,命题人专门卡住那些"以为打开文件就能重定向"的考生。

解题关键:重定向本质是改变cout的底层缓冲指针。freopen直接接管stdout缓冲;ofstream构造后必须用outFile<<才能写入;rdbuf临时切换缓冲池。C选项中ofstream声明后从未使用,cout仍输出到控制台,自然失败。B选项中ofstream构造后直接写入,符合预期。D选项通过rdbuf临时切换缓冲池,既保留了cout功能又实现重定向。

陷阱拆解:C选项最阴险——文件流对象声明了但没绑定到cout,属于"有头无尾"的空转代码;很多考生会误以为freopen万能,其实它只对stdout有效;D选项看似复杂,但通过rdbuf确实实现了重定向。

反命题视角:若改成"哪种方式能同时重定向cout和cerr",答案会变成D;若改成"不使用freopen也能重定向",答案则是B或D。刷到同类题先问"被重定向的是哪个流",再决定用freopen还是rdbuf。

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