You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中std::getline按逗号分隔读取文件包含换行符如何解决

问题原因

你直接将逗号作为std::getline的全局分隔符读取文件时,std::getline仅会把逗号作为读取终止符,换行符会被当作普通字符存入读取结果中。比如第一行末尾的5\n1会被当作一个整体读取(直到遇到下一个逗号),导致字符串无法正常转换为double类型。同时你原有代码的循环仅执行了4次,仅能读取4个数值,无法覆盖全部20个元素的存储需求。

修复方案

采用「先按行读取、再逐行拆分数值」的逻辑,从根源上避免换行符混入数值字符串:

  1. 外层循环用默认分隔符(换行符)读取每一行完整内容
  2. 对每一行内容构造std::stringstream,再以逗号为分隔符拆分当前行的5个数值
  3. 调整计数逻辑覆盖全部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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:36:08