布尔函数不读取文本文件中的所有输入

时间:2012-08-26 19:19:54

标签: c++ class fstream

您好我正在开展一个学校项目,我正在努力完成某项功能。 我已经研究了一段时间,我很感激任何类型的输入。

我们必须使用这个功能:

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

2 个答案:

答案 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 循环是否会更好,以及为什么。

最后,请注意,您还应该检查是否没有读取比阵列可以容纳的元素更多的元素。执行此操作时,循环条件会变得更复杂。