C++如何从文件读取数据向pair类型vector添加元素
故障根因
读取异常是getline与>>流运算符的换行处理逻辑冲突导致的:
- 首次循环时,
getline正常读取第一行选手名存入player,>> overall正常读取第二行的整数总评值,因此前两条数据可以正确存入vector。 - 但
>>读取整数时,不会消耗整数末尾紧跟的换行符,这个换行符会残留在流缓冲区中。第二次循环触发getline时,会直接命中这个残留换行符,读取到空字符串赋值给player;后续>> overall尝试读取内容时,会直接读到第三行的选手名字符串,与overall的整型类型不匹配,直接触发流的失败状态位,后续所有读取操作都会直接失败,overall会被置为0,这就是后续元素值全为0的原因。
修复代码
每次通过>>读取完整数后,手动清空当前行残留的换行符即可,注意需要引入<limits>头文件使用numeric_limits:
#include <limits> // 记得添加该头文件 // 核心读取逻辑 while (getline(players, player) && players >> overall) { pick_players.emplace_back(player, overall); // 忽略流中当前位置直到换行符的所有字符,同时消耗掉残留换行符 players.ignore(numeric_limits<streamsize>::max(), '\n'); }
补充校验建议
- 读取文件前先校验
players.is_open(),确认文件正常打开后再执行读取逻辑,避免空流触发异常。 - 如果文件末尾存在多余空行,可以在存入vector前加一层判断,过滤
player为空的无效条目。
内容的提问来源于stack exchange,提问作者Dawid_O
相关产品推荐
相关产品推荐

