C++读取CSV文件输出末尾多余空行导致测试失败如何解决
输出末尾多空行确实是endl使用不当导致的:endl会在输出内容后追加换行符,你当前对每一行有效输出都在末尾加了endl,最后一行数据输出后也会多出一个换行,就形成了末尾的空行。
另外你现有代码中用逗号运算符连接多个getline的写法存在逻辑问题:逗号运算符会忽略前面表达式的返回值,只要最后一个getline执行成功就会进入处理逻辑,字段不足时会读取到错误的脏数据,建议同时修复。
修复方案
修改后代码如下:
#include <iostream> #include <fstream> #include <algorithm> #include <sstream> using namespace std; int main() { fstream file("db.csv", ios::in); string value1, value2, value3, value4, value5, line; bool is_first_line = true; while (getline(file, line)) { if (line.length() > 1) { istringstream str1(line); // 用逻辑与替代逗号运算符,保证所有字段读取成功才处理 if (getline(str1, value1, ',') && getline(str1, value2, ',') && getline(str1, value3, ',') && getline(str1, value4, ',') && getline(str1, value5, '\n')) { value1.erase(remove(value1.begin(), value1.end(), ' '), value1.end()); value2.erase(remove(value2.begin(), value2.end(), ' '), value2.end()); value3.erase(remove(value3.begin(), value3.end(), ' '), value3.end()); value4.erase(remove(value4.begin(), value4.end(), ' '), value4.end()); value5.erase(remove(value5.begin(), value5.end(), ' '), value5.end()); // 非首行先输出换行,再输出内容,避免末尾多空行 if (!is_first_line) { cout << '\n'; } cout << value1 << " " << value2 << " " << value3 << " " << value4 << " " << value5; is_first_line = false; } } } return 0; }
核心修改点:
- 新增首行标记控制换行输出,仅在非首行内容前输出换行,避免最后一行末尾多空行
- 将逗号运算符替换为
&&逻辑与,确保所有字段读取成功才进入处理逻辑 - 移除每行末尾的
endl,不再统一追加末尾换行 - 如果你原本需要输出开头的
result:行,只需要在首行标记定义后加一行cout << "result:\n";即可,不会影响后续的换行逻辑 - 如果你的测试规则要求最后一行末尾必须带一个换行,仅需在
return 0;前加一行cout << '\n';即可
内容的提问来源于stack exchange,提问作者Muffin
相关产品推荐
相关产品推荐

