C++按逗号分割读取CSV行时最后一个元素输出异常问题
问题原因
该问题和CSV分割逻辑本身无关,是换行符格式不匹配导致的:
- 你读取的CSV文件采用Windows标准的CRLF换行符,即每行结尾是
\r\n两个控制字符 std::getline默认仅以\n作为行分隔符,读取时会丢弃\n,但会把行尾的\r(回车符,ASCII码13)残留在读取到的字符串末尾
分割到最后一个字段时,拿到的实际内容是GOOD\r,执行输出语句std::cout<<"["<<lineStream<<"]"<<std::endl;时,输出流程为:
- 输出左中括号
[,光标停在当前行首的[之后 - 输出字段内容
GOOD,光标移动到字符D之后 - 输出字段自带的
\r,该控制符会直接将光标移动回当前行的最起始位置,不会清空已输出内容 - 输出右中括号
],该字符直接覆盖了行首原本的[,最终就呈现出]GOOD的异常效果,左中括号被覆盖消失。
修复方案
读取到每行内容后,先移除末尾残留的\r字符再做后续处理即可,参考代码:
while(getline(file,input_line)){ // 移除Windows换行残留的回车符 if (!input_line.empty() && input_line.back() == '\r') { input_line.pop_back(); } get_inspva(input_line); }
如果需要兼容更多首尾不可见空白的场景,也可以自行实现trim逻辑,清除字符串首尾的空格、制表符、回车等空白字符后再处理。
注:你手动定义的测试字符串
a_line末尾没有携带\r字符,因此直接传参调用函数不会触发该异常,只有读取CRLF格式的文件内容时才会出现该问题。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

