您好我正在开展一个学校项目,我正在努力完成某项功能。 我已经研究了一段时间,我很感激任何类型的输入。
我们必须使用这个功能:
bool movieLibrary::readMovieInfo(ifstream& inFile)
{
inFile>>rank>>year>>votes>>nationality;
getline(inFile,nameMovie);
if (rank < 1)
return false;
else
return true;
}
我的主要功能一直给出错误的输出:
#include "movieLibrary.h"
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
movieLibrary myMovie[5];
ifstream inFile("myMovieLibrary.txt");
int i =0;
//my issue is here
while (myMovie[i].readMovieInfo(inFile))
{
i++;
myMovie[i].readMovieInfo(inFile);
}
for (int i=0;i<5;++i)
{
myMovie[i].printMovieInfo("printList.txt");
}
return 0;
}
这是输出,应该与输入相同,但这是我得到的:
3 2000 24446 b Snatch
2 2008 1902 b RocknRolla
5 2007 25510 a American Gangster
-1 -858993460 -858993460 Ì
-858993460 -858993460 -858993460 Ì
以下是输入:myMovieLibrary.txt
3 2000 24446 b Snatch
2 2004 2872 b Layer Cake
2 2008 1902 b RocknRolla
4 1999 7661 b Lock,Stock and Two Smoking Barrels
5 2007 25510 a American Gangster
-1
rank year votes Nationality (b:british; a:american) name
这是MovieLibrary规范文件:
#include <string>
class movieLibrary
{
public:
movieLibrary();
~movieLibrary();
//void readMovieInfo(std::ifstream&);
bool readMovieInfo(std::ifstream&);
void printMovieInfo(char*);
char getNationality();
int getRank();
bool operator>=(movieLibrary) const;
bool operator<(movieLibrary) const;
private:
int rank; //rank I gave to the movie in my library
int year; //year the movie came out
int votes; //the number of votes that yahoo users gave the movie
std::string nameMovie; //the name of the movie
char nationality; //nationality of movie: b for british and a for american
};
和MovieLibrary的实现类:
#include "movieLibrary.h"
#include <fstream>
#include <string>
using namespace std; // here you can use that.
movieLibrary::movieLibrary()
{
}
movieLibrary::~movieLibrary()
{
}
bool movieLibrary::readMovieInfo(ifstream& inFile)
{
inFile>>rank>>year>>votes>>nationality;
getline(inFile,nameMovie);
if (rank < 1)
return false;
else
return true;
}
void movieLibrary::printMovieInfo(char* outFileName)
{
std::ofstream outFile;
if(!outFile.is_open())
outFile.open(outFileName, std::ios::app);
outFile<<rank<<" "<<year<<" "<<votes<<" "<<nationality<<" "<<nameMovie<<std::endl;
}
int movieLibrary::getRank()
{
return rank;
}
char movieLibrary::getNationality()
{
return nationality;
}
答案 0 :(得分:3)
while (myMovie[i].readMovieInfo(inFile))
{
i++;
myMovie[i].readMovieInfo(inFile);
}
此代码执行此操作:
myMovie[0].readMovieInfo(inFile); // loads Snatch into [0]
myMovie[1].readMovieInfo(inFile); // loads Layer Cake into [1]
myMovie[1].readMovieInfo(inFile); // loads RocknRolla into [1]
myMovie[2].readMovieInfo(inFile); // loads Lock,Stock.. into [2]
myMovie[2].readMovieInfo(inFile); // loads Armerican Gangster into [2]
// until it returns false
readMoveInfo的这个重复调用是导致程序覆盖每一行的原因,例如: myMovie [1]将首先包含'Layer Cake',但在while()
中执行该函数后,它将被'RocknRolla'覆盖。最简单的解决方法,正如另一个已经解决的答案,只是删除readMovieInfo的第二次调用,留下这个:
while (myMovie[i].readMovieInfo(inFile)) i++;
答案 1 :(得分:2)
由于您在循环条件中调用readMovieInfo
,在循环体中调用以及,因此除了0之外,您将为每个索引调用两次。
由于你在每次迭代中第二次调用之前增加i
,你将用第三个元素覆盖第二个元素,第四个元素用第五个元素覆盖,依此类推:你将从输入中丢失所有其他电影文件。这反映在您的输出中:第二部和第四部电影消失。
请记住,您的循环条件是在每次迭代中测试的,因此您需要注意条件测试中的任何副作用。
您可以通过删除对readMovieInfo
的一个或另一个调用来解决这个问题(作为练习尝试双向进行),但我更愿意看到您在不调用的情况下编写while
条件readMovieInfo
;一旦你完成了这个,考虑一下 do / while 循环是否会更好,以及为什么。
最后,请注意,您还应该检查是否没有读取比阵列可以容纳的元素更多的元素。执行此操作时,循环条件会变得更复杂。