C++读取txt文件时双床/单床价格字段显示为0的问题求解
C++读取txt文件无法获取全部数据的排查方案
问题复现
- 待读取的
Room.txt内容如下:
Standard ;40 90 120 Delux ;70 150 200 VIP ;110 200 300
- 原代码运行后输出异常:仅能正确读取三床房价格,双床房、单床房价格均显示为0。
故障原因
核心问题出在inputRoom函数的字符串分割逻辑:
- 代码仅使用
;作为分隔符切割每行内容,每行最终只会切出2段内容:第一段是房型名称,第二段是分号后带空格的完整价格串(比如第一行的40 90 120),不存在预期的tokens[2]、tokens[3]两个元素,这两个位置始终是空字符串。 - 用
atof转换字符串时,遇到第一个非数字字符(也就是价格串里第一个数字后的空格)就会停止解析,所以只能拿到第一个价格数值,空字符串转float默认得到0,就出现了后两列全为0的现象。 - 额外隐患:
while (room.good())的循环写法不严谨,容易在文件末尾多读一次空行,引发数组越界问题。
修正方案
调整inputRoom函数的分割逻辑:拿到分号后的价格串后,直接通过流读取三个浮点数即可,不需要手动做多段字符串分割,同时修正循环判断条件避免读空行。修正后的函数如下:
void inputRoom(ifstream &room, Room choice[]) { string line; int j = 0; // 直接将getline返回值作为循环判断条件,避免多读文件末尾空行 while (getline(room, line)) { stringstream ss(line); string roomType, priceStr; // 先按分号分割,拿到房型名和整段价格字符串 getline(ss, roomType, ';'); getline(ss, priceStr); choice[j].roomType = roomType; // 将价格串转为流,直接读取三个浮点型价格 stringstream priceSs(priceStr); priceSs >> choice[j].tripleBed >> choice[j].doubleBed >> choice[j].singleBed; j++; } }
替换原代码中的inputRoom函数后重新编译运行,即可正确读取全部三个价格数值。
内容的提问来源于stack exchange,提问作者Anim
相关产品推荐
相关产品推荐

