我正在尝试从文本文件中读取数据并将其存储为我创建的名为Movie的类对象。我还必须创建一个指向每个Movie的指针向量。我使用了一个while循环,它读取到文件末尾并将数据作为电影接收。然后我用一个指针动态创建一个保存数据的新Movie对象。它开始工作,向量存储指向电影的指针。在第19部电影之后它虽然停止了(我必须阅读约300部电影)。我不知道为什么,但我在调试器中跟着它。没有错误代码。它只是停止,程序不会持续到最后。
//Variables
string title;
//Open input stream
ifstream fin( "CS172_Spring2014_Movie_inputs.txt" ) ;
vector<Movie*> moviePtrList(350);
vector<Movie*>::iterator pos;
pos = moviePtrList.begin();
while(!fin.eof())
{
getline(fin, title, '\n');
Movie fileMovie(title);
*pos = new Movie(movieFromFile(fin, fileMovie));
pos++;
}
我也尝试过这种方法:
for(string title; getline(fin,title);)
{
/*getline(fin, title, '\n');*/
Movie fileMovie(title);
*pos = new Movie(movieFromFile(fin, fileMovie));
pos++;
}
而且:
for(int i = 0;i<300;i++)
{
getline(fin, title, '\n');
Movie fileMovie(title);
moviePtrList[i] = new Movie(movieFromFile(fin, fileMovie));
cout << i << endl;
}
我也试过fin.good()而不是fin.eof()。没运气。这是我以前从文本文件中读入的子程序:
Movie movieFromFile(ifstream &fin, Movie &inputMovie)
{
Movie_Rating rating = G;
string actor, director, path, inputRating, separator="$$$$";
unsigned int year, actors;
getline(fin, director, '\n');
inputMovie.setDirector(director);
fin >> year;
fin.ignore();
inputMovie.setYear(year);
getline(fin, inputRating, '\n');
if (inputRating == "G") {
rating = G ;
} else if (inputRating == "PG") {
rating = PG ;
} else if (inputRating == "PG13") {
rating = PG13 ;
} else if (inputRating == "R") {
rating = R ;
} else if (inputRating == "NC17") {
rating = NC17 ;
} else if (inputRating == "NR") {
rating = NR ;
}
inputMovie.setRating(rating) ;
fin.ignore();
getline(fin, path, '\n');
inputMovie.setURL(path);
do {
getline(fin, actor, '\n');
inputMovie.addActor(actor);
} while(actor != separator);
return inputMovie;
}
我希望这不是太多的文字。我可能在某个地方犯了一个愚蠢的错误或忽略了一些东西。我准备睡觉了,早上再次攻击它,重写子程序,并阅读更多材料。谢谢你的帮助。
答案 0 :(得分:0)
每次尝试都会遇到同样的核心问题:对指针和对象之间差异的误解。
使用矢量的正确方法是将对象推到它上面。通常,首先需要创建该对象。大多数不必要的是使用指针或迭代器。所以你的代码可能如下:
vector<Movie> movieList();
...
getline(fin, title, '\n');
Movie fileMovie(title);
moveList.push(fileMovie);
考虑对象,而不是指针。你正在做的是未定义的行为,一段时间之后神秘地失败也就不足为奇了。 C ++就是这么做的。
代码还有其他问题(请参阅注释),但我认为这就是它死的原因。解决这个问题并提出另一个问题。