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

C++ fstream的getline函数读取文件行长度多1的问题排查

问题原因

该问题是跨操作系统换行符标准不一致导致的:

  • Windows系统下的文本文件默认使用\r\n(CRLF,两个字符)作为行结束标识
  • Linux系统下的std::getline默认以\n(LF,单个字符)作为行分割符,读取时只会移除行尾的\n,不会处理\r,因此除了没有末尾换行符的最后一行外,其余读取到的行末尾都会多保留一个\r字符,表现为line.size()比实际预期长度多1

你在Clion中运行正常,是因为Clion一般运行在Windows环境,Windows原生的std::getline会自动识别\r\n作为行结束符,同时移除两个字符,因此读取的行长度符合预期。

修复方案

可以选择以下任意一种方案解决:

方案1:转换文件格式(无需修改代码,推荐)

在学校开发服务器上执行dos2unix 你的目标文件名命令,即可将文件的换行符从Windows的CRLF格式批量转换为Linux标准的LF格式,转换后直接运行原有代码就能正常读取。
如果没有dos2unix工具,也可以用sed -i 's/\r$//' 你的目标文件名命令实现相同效果。

方案2:代码兼容处理

在代码中读取每行后手动清理末尾的\r字符,修改原有getline循环逻辑即可,示例如下:

while(getline(myFile, line)){
    // 新增行尾\r清理逻辑
    if (!line.empty() && line.back() == '\r') {
        line.pop_back();
    }
    // 原有逻辑保持不变
    if (line.size()== 1 || line.size()==2 || line == "100"){
        stringstream zz;
        zz << line;
        zz >> num;
        ...
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:24:03