文本冒险程序仅读取rooms.txt描述首行的问题求助
问题分析与解决方案
常见核心原因:输入缓冲区残留换行符
如果你的代码中在调用getline读取房间描述前,使用过cin >>(比如读取房间ID、名称这类字段),cin >>只会读取到空格/换行符为止,会把换行符留在输入缓冲区里。后续第一个getline会直接读取这个空换行符,导致实际的描述内容被截断,只显示第一行。
具体修复方案
1. 清空输入缓冲区
在第一次调用getline之前,添加代码清空缓冲区残留的换行符:
#include <limits> // 需要包含这个头文件 // 在读取描述前执行 cin.ignore(numeric_limits<streamsize>::max(), '\n');
2. 调整多行描述读取逻辑
如果rooms.txt中房间描述是多行内容,需要明确界定描述的起止范围(比如每个房间以特定标记分隔,如===)。修改World::read_rooms函数的读取逻辑:
void World::read_rooms() { ifstream room_file("rooms.txt"); if (!room_file.is_open()) { cerr << "Failed to open rooms.txt" << endl; return; } string line; Room temp_room; bool is_reading_desc = false; while (getline(room_file, line)) { // 假设房间ID以"ROOM_ID:"开头 if (line.starts_with("ROOM_ID:")) { // 保存上一个已读取的房间 if (!temp_room.id.empty()) { rooms.emplace_back(temp_room); temp_room = Room(); // 重置临时房间对象 } temp_room.id = line.substr(8); is_reading_desc = false; } // 假设描述起始标记为"DESC:" else if (line.starts_with("DESC:")) { is_reading_desc = true; temp_room.description = line.substr(5) + "\n"; } // 读取多行描述,直到遇到房间分隔符 else if (is_reading_desc) { if (line == "===END_ROOM===") { is_reading_desc = false; } else { temp_room.description += line + "\n"; } } } // 保存最后一个房间 if (!temp_room.id.empty()) { rooms.emplace_back(temp_room); } room_file.close(); }
验证要点
运行修改后的程序,检查输出的房间描述是否包含所有行内容。如果rooms.txt的格式没有明确分隔符,需要调整判断逻辑,比如读取到下一个房间的ID行时,停止当前房间的描述读取。
内容的提问来源于stack exchange,提问作者chikenjoe
相关产品推荐
相关产品推荐

