下面哪种方式不能实现将字符串 "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。指针和数组的代码追踪:画出变量和指针的内存示意图,追踪每次赋值后值的变化。
指针和数组追踪时画内存布局图可以大大简化理解。
【考点】文件流操作|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 是唯一符合。