假设文件 output.txt 能正常打开,下面代码通过 rdbuf 将 cout 的输出重定向到了文件中。
ofstream fout("output.txt");
streambuf* old_buf = cout.rdbuf();
cout.rdbuf(fout.rdbuf());
cout << "GESP Exam";
cout.rdbuf(old_buf);答案A。根据计算机/编程基础知识分析判断。
仔细审题,注意题目中的所有限定词和条件。不确定时用排除法缩小选项范围。
【考点】流式输出重定向|流缓冲器操作|文件输出流
关键观察是 rdbuf 返回的是流内部的缓冲对象指针。保存旧缓冲后,将 cout 的缓冲替换为 fout 的缓冲,后续输出自然写入文件。恢复时再换回旧缓冲即可。此类题通法:用 rdbuf 交换缓冲指针,先存后换,输出后恢复,操作顺序必须严格匹配。
错误选项常利用“缓冲未恢复”或“输出仍去控制台”的错觉。本题陷阱在于绝对化表述——若认为“重定向后 console 仍有输出”或"rdbuf 操作无效”,就掉进概念偷换。记住:rdbuf 本质是缓冲指针交换,只要保存旧指针并正确恢复,输出流向就完全可控。
若把 fout 改为未打开的流,rdbuf 会访问空指针,程序崩溃;若省略恢复步骤,控制台将永久静默。刷到这类题先问:“命题人想考我流缓冲的交换逻辑,还是缓冲指针的保存机制?”