如何在 C++ 中读取文件并将文件中的数据插入到类类型的向量中?

Posted

技术标签:

【中文标题】如何在 C++ 中读取文件并将文件中的数据插入到类类型的向量中?【英文标题】:How to read from file in c++ and insert data from file into vector thats is type of an class? 【发布时间】:2021-10-05 17:03:15 【问题描述】:

正如标题所说,我需要将文件中的数据插入到我创建的一种类的向量中。 这是我的代码:

#include <iostream>
#include <fstream>
#include "Film.h"
#include "Comedy.h"
#include <string>
#include <vector>
using namespace std;
Comedy k;
Film f;

int main() 
    vector <Comedy> comedy;
   

    ifstream Comedies("Comedy.txt", ios::in);
    int number = 0;
    string line;
    while (getline(Comedies, line)) 
        br++;
        komedija.push_back(line); // this is where I get the error
    
   

这是喜剧课:

#pragma once
#include "Film.h"
#include "Actor.h"
#include <vector>
#include <string>
#include <fstream>
using namespace std;

enum Type2 black = 1, romantic, child;

class Comedy :
    public Film

private:
    vector<Actor>actors;
    Type2 typeComedy;
public:
    void setActors();
    vector<Actors>& getActors();
    void setType();
    Type2 getType();
    void insert();
;
 

任何人都知道是什么问题,我认为这是因为line 变量是一种字符串类型,我试图插入一个不是字符串类型的向量,然后我如何从文件中插入数据变成不是字符串的向量?

这是一个电影类:

#pragma once
class Film

private:
    char name[25];
    int timeOfDuration;
    char startMovieTime[7];
public:
    Film();
    void setName();
    char* getName();
    void setTimeOfDuration();
    int getTimeOfDuratiion();
    void setStartMovieTime();
    char* getStartMovieTime();
    ~Film() ;
;

【问题讨论】:

komedija.push_back(line); 应该产生错误,因为变量被声明为vector &lt;Comedy&gt; comedy; - 顺便说一句,Comedy 真的应该是它自己的一个类吗?感觉更像是Film中的分类成员 我用波斯尼亚语写了一段代码,但是为了这个问题,我把代码从波斯尼亚语翻译成英文,所以我忘了把 komedija.push_back(linija) 改成 comedy.push_back(line) @TedLyngmo - 但comedy.push_back(line); 也会产生错误:将字符串推入 Comedy 的向量中。 @Eugene 是的。如果Film 有一个构造函数采用std::string,我建议改用.emplace_back(line); - 并在Comedy 中执行using Film::Film; @ahmedskulj10 我把它变成了正确显示的答案。 【参考方案1】:

假设Film 有一个接受std::string 的构造函数,我建议将其添加到派生类中:

Comedy 为例:

class Comedy : public Film 
public:
    using Film::Film; // add the `Film` constructor(s)
    // ...
;

然后可以使用std::vector::emplace_back添加一个新的Comedy

komedija.emplace_back(line);

Demo

如果您出于某种原因想要将电影名称存储在 char[] 中,您仍然可以使用接受 std::string 的构造函数并将其存储在您的 char[] 中。

例子:

#include <algorithm> // std::copy_n, std::min

class Film 
private:
    char name[25];

public:
    Film() : name  // initialize name

    // added constructor:
    Film(const std::string& Name) : Film() 
        std::copy_n(Name.c_str(), std::min(sizeof name - 1, Name.size()), name);
    
;

注意:除非Comedy 有一些特殊的成员变量/函数,否则我建议将category 成员添加到Film,而不是从Film 继承。

【讨论】:

我的电影类有一个 char 变量,它没有 std::string 变量。那么当我有 char 变量时该怎么做呢? @ahmedskulj10 我会立即将这些更改为 std::string 变量。 我同意,但我想这样做,这样我就可以练习了。如果你能告诉我怎么做,我将不胜感激。 @ahmedskulj10 当然-请将Film 的当前定义添加到问题中,我会将其添加为选项 @ahmedskulj10 太好了 - 我添加了一个可能的修复方法【参考方案2】:

我发现最好的方法是使用vector的迭代器构造函数

int main()

    std::ifstream       comedyFile("Comedy.txt")
    std::vector<Comedy> comedy(std::istream_iterator<Comedy>(comedyFile),
                               std::istream_iterator<Comedy>);


这假定Comedy 定义了一个operator&gt;&gt;,它将从流中读取到默认构造的Comedy 对象中。

class Comedy

    public:
        Comedy()  // creates a default object.
        friend std::istream& operator>>(std::istream& stream, Comedy& obj) 
            obj.load(stream);
            return stream;
        
    private:
        void load(std::istream& stream) 
            // read from the stream into your object.
        
;
           

有时创建一个默认对象是不切实际或不好的。在这种情况下,您可以创建一个读取数据并允许构造对象的“Reader”对象。

  int main()

    std::ifstream       comedyFile("Comedy.txt")
    std::vector<Comedy> comedy(std::istream_iterator<ComedyReader>(comedyFile),
                               std::istream_iterator<ComedyReader>);


这假定ComedyReader 定义了一个operator&gt;&gt;,它将从流中读取。然后,您可以以一种有用的方式存储文件中的数据,然后在将对象推入向量时构造对象(因为这将导致转换,您只需能够将对象转换为喜剧)。

class ComedyReader

    std::string  dataForComedy;
    friend std::istream& operator>>(std::istream& stream, ComedyReader& reader) 
        std::getline(stream, dataForComedy);
        return stream;
    
    // Now we need to be able to create a Comedy from a string.
    operator Comedy() const 
        return Comedy(std::move(dataForComedy));
    
;

class Comedy

    public:
        Comedy(std::string data) 
            // read from the string into your object.
        
;
      

当移动对象时,提供移动构造函数总是很好的(尽管有时复制构造函数就足够了)。

class Comedy

    public:
        // Move Operators
        Comedy(Comedy&& src)            noexcept;
        Comedy& operator=(Comedy&& src) noexcept;

        // Copy Operators
        Comedy(Comedy const& src);
        Comedy& operator=(Comedy const& src);
;

【讨论】:

以上是关于如何在 C++ 中读取文件并将文件中的数据插入到类类型的向量中?的主要内容,如果未能解决你的问题,请参考以下文章

c# 中,如何读取XML文件,并将读取到的内容显示到TreeView中

C++如何逐行读取txt文件,并将读取出来的数据进行运算导入到另一个文件中。

SQLite - 如何从 XML 文件插入 JPG 图像(使用 Delphi 2009)

从缺少列的文件中读取数据。 C++

如何在 MySQL 数据库中插入 pdf 文件,然后在 php 中读取?

插入多个文本文件