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

C++读取txt文件时使用float类型仅输出首行的问题求助

问题分析与解决

问题根源

  1. 产品名含空格导致读取失败:ham pizza这类带空格的产品名,用operator>>读取string时只会获取第一个单词ham,后续尝试将pizza读取为float类型会失败,触发流的错误状态,直接终止循环。
  2. 文件打开检查逻辑错误:原代码将文件打开检查放在循环之后,若文件未成功打开,循环不会执行,此时再输出错误信息已经滞后,逻辑顺序颠倒。
  3. 缺少必要头文件:代码未包含<fstream>(ifstream依赖)、<iostream>(cout依赖)、<cstdlib>(exit依赖),编译时会报错。

修正方案

通过逐行读取文件内容,分割每行的产品名(含空格)和价格,确保完整读取所有条目,同时保留float类型用于后续计算。

修正后的代码

#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>

using namespace std;

int main() 
{
    string product_name;
    float price;
    string line;

    ifstream file("shopping.txt");
    
    // 立即检查文件是否打开成功
    if (!file.is_open()) {
        cout << "Failed to open the file!" << endl;
        exit(-1);
    }

    // 逐行读取文件内容
    while (getline(file, line)) {
        // 找到行中最后一个空格的位置(分隔产品名和价格)
        size_t last_space = line.find_last_of(' ');
        if (last_space != string::npos) {
            // 提取产品名并去除末尾多余空格
            product_name = line.substr(0, last_space);
            product_name.erase(product_name.find_last_not_of(' ') + 1);
            // 提取价格字符串并转换为float
            price = stof(line.substr(last_space + 1));
            // 输出结果
            cout << product_name << ": " << price << " euros" << endl;
        }
    }

    file.close();
    return 0;
}

关键修正点说明

  • 逐行读取:用getline读取整行内容,避免产品名被空格截断。
  • 分割逻辑:通过find_last_of定位最后一个空格,确保价格是行的最后部分,前面的所有内容都是产品名(处理末尾多余空格保证格式整洁)。
  • 调整检查顺序:文件打开后立即检查状态,确保异常情况及时处理。
  • 补充头文件:添加所有依赖的标准库头文件,保证代码可编译运行。

内容的提问来源于stack exchange,提问作者Thịnh Đức

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:15:46