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

Boolean function doesn't read all the input from a text file

本文关键字:读取 输入 文件 文本 函数 布尔      更新时间:2023-10-16

嗨,我正在做一个学校项目,我很难处理一个特定的函数。我已经做了一段时间了,我会感谢任何类型的意见。

我们必须使用这个功能:

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;
}
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的重复调用导致程序每隔2行覆盖一次,例如myMovie[1]将首先包含"Layer Cake",但在while()中执行该函数后,它将被"RocknRolla"覆盖。正如另一个答案已经指出的那样,最简单的解决方案就是删除readMovieInfo的第二个调用,留下这个:

while (myMovie[i].readMovieInfo(inFile)) i++;

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

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

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

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

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