1

嗨,我正在做一个学校项目,但我在使用特定功能时遇到了困难。我已经为此工作了一段时间,我将不胜感激任何类型的输入。

我们必须使用这个功能:

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;
}
4

2 回答 2

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”,但在函数执行后将被“RocknRolla”覆盖while()。最简单的解决方案,正如已经指出的另一个答案,只是删除 readMovieInfo 的第二次调用,留下这个:

while (myMovie[i].readMovieInfo(inFile)) i++;
于 2012-08-26T19:23:20.910 回答
2

由于您readMovieInfo在循环条件以及循环主体中调用,因此您将为除 0 之外的每个索引调用两次。

由于您在每次迭代中的第二次调用之前递增i,因此您将用第三个元素覆盖第二个元素,用第五个覆盖第四个元素,依此类推:您将丢失输入文件中的所有其他电影。这反映在您的输出中:第二和第四部电影消失了。

请记住,您的循环条件在每次迭代时都会进行测试,因此您需要小心条件测试的任何副作用。

您可以通过删除一个或其他调用来解决这个问题readMovieInfo(作为练习尝试两种方式进行),但我更希望看到您在while不调用readMovieInfo;的情况下写下您的条件 完成此操作后,请考虑do/while循环是否更好,以及为什么。

最后,请注意,您还应该检查您读取的元素是否超过了数组可以容纳的数量。当你这样做时,你的循环条件变得更加复杂。

于 2012-08-26T19:24:57.753 回答