如何在 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 <Comedy> 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>>
,它将从流中读取到默认构造的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>>
,它将从流中读取。然后,您可以以一种有用的方式存储文件中的数据,然后在将对象推入向量时构造对象(因为这将导致转换,您只需能够将对象转换为喜剧)。
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)