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
相关产品推荐
相关产品推荐

