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

