C++中std::getline按逗号分隔读取文件包含换行符如何解决
问题原因
你直接将逗号作为std::getline的全局分隔符读取文件时,std::getline仅会把逗号作为读取终止符,换行符会被当作普通字符存入读取结果中。比如第一行末尾的5\n1会被当作一个整体读取(直到遇到下一个逗号),导致字符串无法正常转换为double类型。同时你原有代码的循环仅执行了4次,仅能读取4个数值,无法覆盖全部20个元素的存储需求。
修复方案
采用「先按行读取、再逐行拆分数值」的逻辑,从根源上避免换行符混入数值字符串:
- 外层循环用默认分隔符(换行符)读取每一行完整内容
- 对每一行内容构造
std::stringstream,再以逗号为分隔符拆分当前行的5个数值 - 调整计数逻辑覆盖全部20个数值的存储,最后遍历输出即可
完整可运行代码
#include <iostream> #include <fstream> #include <string> #include <sstream> static const int Ncol = 5; static const int Nrow = 4; int main() { int ctr = 0; std::string line, val_str; std::ifstream myFile1; std::cout.precision(15); std::cout << std::fixed; double* input = new double[Nrow * Ncol]; // 不需要ftrue可删除该行,此处保留原有定义 double* ftrue = new double[Nrow]; myFile1.open("./Data_codelink_test/test.txt"); // 新增文件打开失败判断,提升代码健壮性 if (!myFile1.is_open()) { std::cerr << "文件打开失败" << std::endl; return 1; } // 外层循环逐行读取 while (std::getline(myFile1, line) && ctr < Nrow * Ncol) { std::istringstream line_ss(line); // 内层循环拆分当前行的逗号分隔数值 while (std::getline(line_ss, val_str, ',') && ctr < Nrow * Ncol) { input[ctr] = std::stod(val_str); ctr++; } } myFile1.close(); // 按预期格式输出 for (int i = 0; i < Nrow * Ncol; i++) { std::cout << input[i] << std::endl; } // 释放动态申请的内存 delete[] input; delete[] ftrue; return 0; }
运行效果
上述代码读取你提供的测试文件后,输出结果完全匹配预期格式,每个数值单独占一行。
内容的提问来源于stack exchange,提问作者readysetcode
相关产品推荐
相关产品推荐

