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

如何按自定义分隔符读取文件并映射为customClass对象数组?

解决带空格字段的文件解析问题

我之前也踩过一模一样的坑!>>运算符默认是按空白字符(空格、换行、制表符这些)拆分内容的,所以用它读取时,第三个带空格的字段肯定会被拆得七零八落。要搞定这个问题,最靠谱的思路是先把整行完整读进来,再按分号拆分字段,这样不管第三个字段有多少空格都能完整获取。

先给你补全一下模型类(得加public权限才能正常赋值):

class customClass {
public:
    std::string s1;
    std::string s2;
    std::string s3;
};

然后是核心的解析实现,直接就能用:

#include <fstream>
#include <vector>
#include <string>

std::vector<customClass> parseCustomFile(std::ifstream& infile) {
    std::vector<customClass> objects;
    std::string line;

    // 用getline逐行读取,完整保留每行的所有内容(包括空格)
    while (std::getline(infile, line)) {
        customClass obj;

        // 定位第一个分号,截取s1
        size_t firstSemi = line.find(';');
        if (firstSemi == std::string::npos) continue; // 格式错误的行直接跳过
        obj.s1 = line.substr(0, firstSemi);

        // 从第一个分号后开始找第二个分号,截取s2
        size_t secondSemi = line.find(';', firstSemi + 1);
        if (secondSemi == std::string::npos) continue;
        obj.s2 = line.substr(firstSemi + 1, secondSemi - firstSemi - 1);

        // 第二个分号后的所有内容都是s3,不管包含多少空格
        obj.s3 = line.substr(secondSemi + 1);

        objects.push_back(obj);
    }

    return objects;
}

为啥这个方法靠谱?

std::getline会把整行内容完整读取到字符串里,直到遇到换行符才停止,完全不会被空格打断。之后我们用string::find精准定位分号的位置,再通过substr截取对应字段,完美匹配你的文件格式:

  • s1对应第一个分号前的内容
  • s2对应两个分号之间的内容
  • s3对应第二个分号之后的所有内容(包括空格、特殊字符等)

我还加了简单的格式校验,如果某行没有两个分号,就直接跳过,避免程序因为非法格式崩溃。

内容的提问来源于stack exchange,提问作者J.Joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:11:11