执行下面 C++ 程序,会输出( )。
int main() {
ofstream fout("test.txt");
fout << "Happy" << endl;
fout << "New Year";
fout.close();
ifstream fin("test.txt");
string s1, s2;
fin >> s1;
getline(fin, s2);
fin.close();
cout << s1 << "|" << s2;
return 0;
}答案D。指针和数组的代码追踪:画出变量和指针的内存示意图,追踪每次赋值后值的变化。
指针和数组追踪时画内存布局图可以大大简化理解。
【考点】文件流操作|字符串输入|getline 的换行处理
【考纲定位】本题对应 GESP 四级“输入输出”模块,重点考察文件流与字符串输入的配合。命题人利用“>>只读空格前字符”与“getline 读取整行”的交互,卡住 70% 考生对缓冲区残留换行的认知盲区。
【解题思维】文件写入后内容为:第一行"Happy",第二行"New Year"。fin >> s1; 仅提取"Happy"(遇空格/换行停止),回车符仍留在缓冲区;随后 getline(fin, s2); 从缓冲区剩余位置读,恰好读到空行,s2 被赋空串。最终输出为"Happy|"。
【陷阱拆解】A 项假设 getline 读了第二行,却忽略了>>后缓冲区残留;B 项凭空加入空格;C 项完全颠倒输入逻辑;D 项才是对">>遇换行停止”与"getline 读空行”的正确组合。若只记结论不理解流操作细节,必选错。
【反命题思维】若将第二个输出改为 fout << "New Year" << endl;,则 getline 会读到"New Year",答案变 A;若改为 fin >> s1 >> s2; 则 s2 会读到"New Year",答案变 A;若改为 cin.ignore() 再 getline,s2 会读到"New Year",答案变 A。刷到类似题先问">>后缓冲区还剩什么”。