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

从文件读取数据填充vector:CHotel与CTurist对象关联异常求助

嘿,我看你在处理文件解析绑定酒店和游客对象的时候踩坑了——明明vector m_hoteli里存了数据,但游客信息却被当成酒店属性存进去了,没法正确关联CTurist和对应的CHotel对吧?结合你给的数据示例,我来帮你分析问题和解决思路:

问题核心分析

你的问题根源在于文件读取逻辑没有区分“酒店数据”和“该酒店对应的游客数据”的边界。从你给出的示例Marina 5 500 Joe 21 ...来看,数据格式应该是:每一组酒店数据以[酒店名称] [酒店属性(比如星级)] [该酒店游客总数]开头,之后紧跟该酒店所有游客的属性数据。而你当前的代码读完酒店基础属性后,没有切换到“读取游客”的模式,直接把后续的游客信息当成了新酒店的属性处理,最终导致游客和酒店的关联完全混乱。

具体解决步骤

  • 先明确数据格式规则
    先确认文件中酒店与游客的组织逻辑:是一行包含一个酒店的所有数据(酒店属性+所有游客),还是酒店占一行、后续N行是该酒店的游客?从你的示例来看是前者,那游客总数(比如示例中的500)就是切换读取模式的关键标识。

  • 修正读取逻辑的边界处理
    你需要调整代码流程,让读取操作在读完酒店基础属性后,进入“读取对应数量游客”的分支,完成当前酒店的填充后,再去处理下一个酒店:

    1. 读取酒店名称、酒店属性(比如星级)、游客总数;
    2. 创建当前CHotel对象,初始化酒店属性;
    3. 循环读取游客总数次的游客数据,每次创建CTurist对象并添加到当前酒店的游客列表中;
    4. 将绑定好游客的CHotel对象存入m_hoteli;
    5. 重复上述步骤直到文件读取完毕。
  • 代码示例参考
    这里给你一个简化的C++代码片段,帮你理清正确的逻辑:

    #include <fstream>
    #include <vector>
    // 假设CHotel和CTurist的类已定义,且CHotel有addTourist方法用于添加游客
    
    std::vector<CHotel> m_hoteli;
    
    void readHotelsFromFile(const std::string& filePath) {
        std::ifstream file(filePath);
        if (!file.is_open()) {
            // 处理文件打开失败的情况
            return;
        }
    
        std::string hotelName;
        int starRating, touristCount;
        // 先读取酒店核心属性,直到文件结束
        while (file >> hotelName >> starRating >> touristCount) {
            CHotel currentHotel(hotelName, starRating);
            // 循环读取对应数量的游客
            for (int i = 0; i < touristCount; ++i) {
                std::string touristName;
                int touristAge;
                // 这里根据你的CTurist结构,补充读取其他游客属性
                if (!(file >> touristName >> touristAge)) {
                    // 处理数据不完整的异常情况
                    break;
                }
                CTurist currentTourist(touristName, touristAge);
                currentHotel.addTourist(currentTourist);
            }
            // 把绑定好游客的酒店加入vector
            m_hoteli.push_back(currentHotel);
        }
        file.close();
    }
    
  • 调试小技巧
    可以在读取过程中加入打印日志,比如每次创建酒店时打印"正在处理酒店:" + hotelName + ",游客数量:" + std::to_string(touristCount),每添加一个游客时打印"添加游客:" + touristName,这样就能直观看到哪一步出现了数据读取错位,快速定位问题。

内容的提问来源于stack exchange,提问作者TimothyY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:09:45