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

C++读取txt文件时双床/单床价格字段显示为0的问题求解

C++读取txt文件无法获取全部数据的排查方案

问题复现

  • 待读取的Room.txt内容如下:
Standard    ;40 90 120
Delux       ;70 150 200
VIP         ;110 200 300
  • 原代码运行后输出异常:仅能正确读取三床房价格,双床房、单床房价格均显示为0。

故障原因

核心问题出在inputRoom函数的字符串分割逻辑:

  1. 代码仅使用;作为分隔符切割每行内容,每行最终只会切出2段内容:第一段是房型名称,第二段是分号后带空格的完整价格串(比如第一行的40 90 120),不存在预期的tokens[2]、tokens[3]两个元素,这两个位置始终是空字符串。
  2. 用atof转换字符串时,遇到第一个非数字字符(也就是价格串里第一个数字后的空格)就会停止解析,所以只能拿到第一个价格数值,空字符串转float默认得到0,就出现了后两列全为0的现象。
  3. 额外隐患: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:24:41