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

从文本读取多行内容并封装为DCCharacters对象的技术咨询

搞定文本读取+对象封装到Vector的方案

嘿,针对你要读取DC角色文本、封装成DCCharacters对象并存入vector的需求,我整理了一套实用的实现方案,一步步来:

第一步:先把DCCharacters类搭好

首先得确保你的类结构和示例构造函数匹配,我给你写个基础版本,你可以根据需求扩展:

#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <regex>
#include <iostream>

class DCCharacters {
private:
    std::string characterName;
    std::string characterRole;
    std::string description;
public:
    // 完全匹配你给的构造函数格式
    DCCharacters(std::string name, std::string role, std::string desc)
        : characterName(std::move(name)), characterRole(std::move(role)), description(std::move(desc)) {}

    // 加个打印函数方便验证结果,不用的话可以删掉
    void printCharacter() const {
        std::cout << "角色:" << characterName << "\n定位:" << characterRole << "\n描述:" << description << "\n\n";
    }
};

第二步:核心的文本读取与解析逻辑

你的文本格式是固定的角色名 [定位] 描述,用正则表达式来提取内容最靠谱,比手动找字符位置灵活多了,能处理角色名带空格的情况(比如"batman beyond"这种)。直接看代码:

int main() {
    std::vector<DCCharacters> dcCharacterList;
    std::ifstream inputFile("dc_roles.txt"); // 替换成你的实际文件名
    std::string line;

    // 正则表达式:精准匹配你的文本格式
    // 拆解一下:
    // ^([^\[]+) → 匹配开头到「[」之前的所有内容(角色名)
    // \[([^\]]+)\] → 匹配「[]」包裹的内容(角色定位)
    // (.*)$ → 匹配剩下的所有内容(描述)
    std::regex linePattern(R"(^([^\[]+)\s+\[([^\]]+)\]\s+(.*)$)");

    // 先检查文件能不能打开
    if (!inputFile.is_open()) {
        std::cerr << "糟了,打不开目标文件!" << std::endl;
        return 1;
    }

    // 逐行读取解析
    while (std::getline(inputFile, line)) {
        std::smatch matchResults;
        if (std::regex_match(line, matchResults, linePattern)) {
            // 提取三个分组的内容
            std::string charName = matchResults[1].str();
            std::string charRole = matchResults[2].str();
            std::string charDesc = matchResults[3].str();

            // *用emplace_back代替push_back更高效*:直接在vector的内存里构造对象,避免额外拷贝
            dcCharacterList.emplace_back(charName, charRole, charDesc);
        } else {
            std::cerr << "这条格式不对哦:" << line << std::endl;
        }
    }

    inputFile.close();

    // 验证一下结果,遍历vector打印所有角色
    for (const auto& character : dcCharacterList) {
        character.printCharacter();
    }

    return 0;
}

一些实用小贴士

  • 正则的优势:如果角色名是"darkseid"没问题,但要是"harley quinn"这种带空格的,手动分割字符串容易出错,正则能完美处理所有符合格式的情况。
  • 错误处理:加了文件打开失败和格式错误行的提示,调试的时候能快速定位问题,不用瞎猜哪里出错了。
  • 可扩展性:如果以后文本格式有小变动,只要调整正则表达式就行,不用大改逻辑。

测试用例验证

如果你的文本文件内容是:

doomsday [villain] Doomsday是DC漫画旗下美国漫画中登场的虚构超级反派。
superman [hero] Superman是DC漫画旗下美国漫画中登场的虚构超级英雄。

运行程序后,vector里就会有两个DCCharacters对象,输出结果是:

角色:doomsday
定位:villain
描述:Doomsday是DC漫画旗下美国漫画中登场的虚构超级反派。

角色:superman
定位:hero
描述:Superman是DC漫画旗下美国漫画中登场的虚构超级英雄。

内容的提问来源于stack exchange,提问作者Marqueueque

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:42:44