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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:06:04