C++如何读取文件内容并插入到自定义类类型的vector容器中
问题原因
你遇到的报错有两个核心原因:
- 基础拼写错误:你定义的存储Comedy对象的vector名字是
comedy,调用push_back时写的komedija是拼写错误,另外循环内用到的br变量未定义。 - 类型不匹配:
vector<Comedy>要求存储的元素必须是Comedy类的实例,你直接传入读取到的string类型的line变量,类型不匹配自然无法插入。
解决步骤
1. 修正基础语法错误
先把拼写错误的变量名改对,未定义的变量替换成你声明的计数变量number,同时增加文件打开成功的校验,避免无效读取。
2. 调整现有类的方法定义
你当前的Film和Comedy类的set方法都是无参设计,无法直接传入读取到的字段值,需要修改为带参数的可赋值版本,示例修改如下:
// Film类的set方法修改示例 void Film::setName(const char* n) { strncpy(name, n, sizeof(name)-1); name[sizeof(name)-1] = '\0'; // 避免字符串溢出 } void Film::setTimeOfDuration(int t) { timeOfDuration = t; } void Film::setStartMovieTime(const char* t) { strncpy(startMovieTime, t, sizeof(startMovieTime)-1); startMovieTime[sizeof(startMovieTime)-1] = '\0'; } // Comedy类的set方法修改示例 void Comedy::setType(Type2 t) { typeComedy = t; } // 另外修正Comedy类的笔误:getActors返回值类型应该是vector<Actor>&,你多写了个s成Actors
3. 解析文本行构造Comedy对象
你需要先明确Comedy.txt每一行的字段分隔规则,比如是按逗号、空格还是制表符分隔,我们假设你每一行是按逗号分隔,格式为电影名,时长,上映时间,喜剧类型编号,演员1,演员2...,参考实现如下:
#include <iostream> #include <fstream> #include <sstream> #include "Film.h" #include "Comedy.h" #include "Actor.h" #include <string> #include <vector> using namespace std; // 字符串分割辅助函数 vector<string> split(const string& s, char delimiter) { vector<string> tokens; string token; istringstream tokenStream(s); while (getline(tokenStream, token, delimiter)) { tokens.push_back(token); } return tokens; } int main() { vector <Comedy> comedy; ifstream Comedies("Comedy.txt", ios::in); // 先判断文件是否成功打开 if (!Comedies.is_open()) { cout << "Comedy.txt文件打开失败,请检查路径是否正确" << endl; return 1; } int number = 0; string line; while (getline(Comedies, line)) { number++; // 按逗号拆分当前行的所有字段 vector<string> fields = split(line, ','); // 实例化空Comedy对象 Comedy tmpComedy; // 给父类Film属性赋值 tmpComedy.setName(fields[0].c_str()); tmpComedy.setTimeOfDuration(stoi(fields[1])); tmpComedy.setStartMovieTime(fields[2].c_str()); // 给Comedy自有属性赋值 tmpComedy.setType(static_cast<Type2>(stoi(fields[3]))); // 处理演员列表,构造Actor对象存入 for (int i = 4; i < fields.size(); i++) { Actor tmpActor; // 按你自己的Actor类方法赋值,比如假设Actor有setName方法 tmpActor.setName(fields[i].c_str()); tmpComedy.getActors().push_back(tmpActor); } // 把构造完成的Comedy对象插入vector comedy.push_back(tmpComedy); } Comedies.close(); // 后续可以正常使用comedy容器里的对象 return 0; }
如果你的文本行分隔规则不是逗号,把split函数的第二个参数换成对应的分隔符即可,字段顺序也可以根据你实际的文件格式调整。
内容的提问来源于stack exchange,提问作者ahmedskulj10
相关产品推荐
相关产品推荐

