C++读取逗号分隔文本文件出现最后一行重复或空行问题咨询
问题产生原因
- 核心错误是
while (ip.good())的判断逻辑不符合C++流的读取规则:ip.good()仅检查流当前的状态是否正常,不会预判下一次读取操作是否能成功。当读取到文件最后一行的末尾后,流还未触发EOF标识,ip.good()仍然返回true,会导致循环额外多执行一次。 - 额外进入的那次循环中,所有
getline调用都会因为没有可读取内容触发EOF状态,同时会清空传入的字符串变量,最终你拿到的就是空字段,表现为最后一行为空;如果文件最后一行末尾没有换行符,还会出现最后一行内容重复读取的问题。 - 你在末尾新增测试行后,原内容的末尾都有换行符,所以原有内容可以被正常读取,但读完最后一行测试内容后,流依然未触发EOF,又多执行一次循环,就出现了多出空行的现象。
推荐修复写法
建议先逐行读取文件内容,再拆分每行的字段,避免跨行读取的边界问题:
#include <sstream> #include <string> // ... std::string line; // 直接将getline作为循环判断条件,读取失败自动终止循环 while (std::getline(ip, line)) { std::istringstream line_stream(line); std::string pid, npid, fid, nfid, sys, gf; // 逐字段读取,所有字段读取成功再处理 if (std::getline(line_stream, pid, ',') && std::getline(line_stream, npid, ',') && std::getline(line_stream, fid, ',') && std::getline(line_stream, nfid, ',') && std::getline(line_stream, sys, ',') && std::getline(line_stream, gf)) { // 在这里处理读取到的各个字段 } }
内容的提问来源于stack exchange,提问作者sdbvuf sbjdsfdib
相关产品推荐
相关产品推荐

