You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

文本冒险程序仅读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:34:54