如何在C++中使用getline函数正确读取含空格州名的人口普查文件
问题原因分析
原代码使用>>运算符读取州名时,默认以任意空白符(空格、换行、制表符等)作为分隔符,遇到District of Columbia这类带空格的多词州名时会直接截断,剩下的名称内容会被错误识别为人口数值,最终导致整个文件读取逻辑崩溃。
同时你当前使用的while (!in.eof())写法存在逻辑缺陷,该标记是读取操作失败后才会被置位,会导致最后一行内容被重复读取一次。
修正后的代码实现
我们改用getline()逐行读取整行内容,再拆分出州名和人口数值即可:
#include <string> // 确保已引入string头文件 #include <fstream> using namespace std; // 若你的代码中已全局声明可省略该句 state_class::state_class() { count = 0; capacity = 5; ifstream in; pop_DB = new population_record[capacity]; in.open("census2020_data.txt"); // 建议补充文件打开失败判断逻辑,例如:if (!in.is_open()) { 报错逻辑; return; } string line; // 直接用getline返回值作为循环条件,规避eof写法的已知问题 while (getline(in, line)) { if (Is_Full()) { double_size(); } // 跳过文件中可能存在的空行,避免异常 if (line.empty()) continue; // 查找当前行最后一个空格的位置,以此为界拆分州名和人口 size_t last_space_pos = line.find_last_of(" "); // 提取州名:行首到最后一个空格前的所有内容,自动保留州名中的空格 pop_DB[count].state_name = line.substr(0, last_space_pos); // 提取人口:最后一个空格后的内容转成整数,若人口数值超出int范围可替换为stol转长整型 pop_DB[count].population = stoi(line.substr(last_space_pos + 1)); count++; } in.close(); }
关键逻辑说明
getline(in, line)会读取一整行内容直到遇到换行符,自动保留州名中的空格,换行符会被丢弃不会存入line变量find_last_of(" ")从行尾向前查找第一个空格,完美适配州名内任意数量空格的场景,最后一个空格之后的内容必然是人口数值- 用
getline的返回值作为循环判断条件,读取到文件末尾时会自动终止循环,不会出现重复读取的问题
内容的提问来源于stack exchange,提问作者Brooke O
相关产品推荐
相关产品推荐

