从文件读取数据填充vector:CHotel与CTurist对象关联异常求助
嘿,我看你在处理文件解析绑定酒店和游客对象的时候踩坑了——明明vector m_hoteli里存了数据,但游客信息却被当成酒店属性存进去了,没法正确关联CTurist和对应的CHotel对吧?结合你给的数据示例,我来帮你分析问题和解决思路:
你的问题根源在于文件读取逻辑没有区分“酒店数据”和“该酒店对应的游客数据”的边界。从你给出的示例Marina 5 500 Joe 21 ...来看,数据格式应该是:每一组酒店数据以[酒店名称] [酒店属性(比如星级)] [该酒店游客总数]开头,之后紧跟该酒店所有游客的属性数据。而你当前的代码读完酒店基础属性后,没有切换到“读取游客”的模式,直接把后续的游客信息当成了新酒店的属性处理,最终导致游客和酒店的关联完全混乱。
具体解决步骤
先明确数据格式规则
先确认文件中酒店与游客的组织逻辑:是一行包含一个酒店的所有数据(酒店属性+所有游客),还是酒店占一行、后续N行是该酒店的游客?从你的示例来看是前者,那游客总数(比如示例中的500)就是切换读取模式的关键标识。修正读取逻辑的边界处理
你需要调整代码流程,让读取操作在读完酒店基础属性后,进入“读取对应数量游客”的分支,完成当前酒店的填充后,再去处理下一个酒店:- 读取酒店名称、酒店属性(比如星级)、游客总数;
- 创建当前
CHotel对象,初始化酒店属性; - 循环读取游客总数次的游客数据,每次创建
CTurist对象并添加到当前酒店的游客列表中; - 将绑定好游客的
CHotel对象存入m_hoteli; - 重复上述步骤直到文件读取完毕。
代码示例参考
这里给你一个简化的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

