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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:18:03