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

C++读取txt指定数据问题咨询(VS 17.3.3无法使用getline)

C++读取jan91.dat文件:getline使用指导与代码修正

关于getline无法使用的问题

你代码里已经包含了<string>头文件,在VS 17.3.3里getline是可以正常使用的,大概率是你尝试用getline时和>>操作符混用导致的问题——>>会留下换行符在输入流中,后续的getline会直接读取到空行。如果要结合使用,需要先清空流中的换行符,比如用jan91.ignore(numeric_limits<streamsize>::max(), '\n');(记得包含<limits>头文件)。

不过针对你的需求,更合适的方式是用getline逐行读取文件内容,再用istringstream解析每行的字段,这样既能灵活处理后续可能增加的列,也能轻松跳过无效数据(比如示例中的..)。

现有代码的核心问题

你的代码存在几个关键错误,会导致统计结果完全错误:

  • while(!jan91.eof())的陷阱:这个循环会在读取到文件末尾后再执行一次,导致最后一行数据被重复统计,甚至读取无效值。正确的做法是把读取操作放在循环条件里。
  • 多余的分号:if (min_temp < 0);后面的分号让这个if语句变成空语句,不管最低温是否小于0,都会执行below0++;。
  • 温度区间逻辑错误:比如当最高温大于75时,你同时给from0to32、from33to75、above75加1,这显然不符合区间统计的要求——每个温度区间应该是互斥的。
  • 未处理无效数据:当文件中出现..这类非数值内容时,>>读取会失败,此时max_temp和min_temp的值会保留之前的无效值,导致统计错误。

修正后的代码(使用getline)

下面是结合getline和istringstream的修正版本,解决了上述所有问题:

// 统计1991年1月各温度区间的天数
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <limits> // 用于ignore函数

using namespace std;

int main() {
    // 初始化计数器
    int below0 = 0, from0to32 = 0, from33to75 = 0, above75 = 0;
    const string FILENAME = "jan91.dat";

    // 打开文件
    ifstream jan91(FILENAME);
    if (!jan91.is_open()) {
        cerr << "无法打开文件" << endl;
        return 1;
    }

    string line;
    // 逐行读取文件
    while (getline(jan91, line)) {
        istringstream lineStream(line);
        int date;
        double max_temp, min_temp;
        // 尝试读取日期、最高温、最低温,忽略后续列
        if (lineStream >> date >> max_temp >> min_temp) {
            // 统计最低温低于0的天数
            if (min_temp < 0) {
                below0++;
            }
            // 统计最高温所在区间
            if (max_temp > 75) {
                above75++;
            } else if (max_temp >= 33 && max_temp <= 75) {
                from33to75++;
            } else if (max_temp >= 0 && max_temp <= 32) {
                from0to32++;
            }
            // 这里可以添加对其他区间的处理,比如max_temp <0的情况
        }
        // 如果读取失败(比如遇到..),则跳过该行
    }

    // 输出统计结果
    cout << "1991年1月温度区间统计" << endl;
    cout << "温度区间\t\t天数" << endl;
    cout << "低于0℃\t\t\t" << below0 << endl;
    cout << "0℃-32℃\t\t\t" << from0to32 << endl;
    cout << "33℃-75℃\t\t" << from33to75 << endl;
    cout << "高于75℃\t\t\t" << above75 << endl;

    jan91.close();
    return 0;
}

代码说明

  1. 逐行读取:用getline(jan91, line)读取每一行,避免了>>操作符的换行符问题,也能完整处理每行内容。
  2. 解析每行:用istringstream把每行字符串转换成输入流,方便提取所需的字段,后续要读取湿度等列时,只需在lineStream >> ...中添加对应的变量即可。
  3. 无效数据处理:只有当成功读取到日期、最高温、最低温时,才进行统计,否则跳过该行(比如遇到..的情况)。
  4. 修正逻辑错误:温度区间改为互斥判断,去掉了多余的分号,修复了循环条件的问题。

内容的提问来源于stack exchange,提问作者Guileful

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:21:02