指针和ifstream矢量

时间:2014-08-31 03:45:02

标签: c++ pointers vector ifstream

我正在尝试从文本文件中读取数据并将其存储为我创建的名为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;


}

我希望这不是太多的文字。我可能在某个地方犯了一个愚蠢的错误或忽略了一些东西。我准备睡觉了,早上再次攻击它,重写子程序,并阅读更多材料。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

每次尝试都会遇到同样的核心问题:对指针和对象之间差异的误解。

使用矢量的正确方法是将对象推到它上面。通常,首先需要创建该对象。大多数必要的是使用指针或迭代器。所以你的代码可能如下:

vector<Movie> movieList();
...
getline(fin, title, '\n');
Movie fileMovie(title);
moveList.push(fileMovie);

考虑对象,而不是指针。你正在做的是未定义的行为,一段时间之后神秘地失败也就不足为奇了。 C ++就是这么做的。

代码还有其他问题(请参阅注释),但我认为这就是它死的原因。解决这个问题并提出另一个问题。