从文本读取多行内容并封装为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
相关产品推荐
相关产品推荐

