布尔函数不会从文本文件中读取所有输入
Boolean function doesn't read all the input from a text file
嗨,我正在做一个学校项目,我很难处理一个特定的函数。我已经做了一段时间了,我会感谢任何类型的意见。
我们必须使用这个功能:
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循环是否更好,以及为什么。
最后,请注意,您还应该检查您读取的元素是否超过了数组所能容纳的数量。当您这样做时,循环条件会变得更加复杂。
相关文章:
- 为什么从 std::cin 读取输入后右括号字符的值有时不是")"?
- 函数 freopen 不读取输入
- 我遇到使用 c++ 逐行读取输入文件的问题
- 控制台未正确读取输入字符串
- 在C++中使用istringstream读取输入时出错
- 不读取C++输入
- C++ 仅读取输入文件中的部分(不是全部)数据以添加到记录中
- 读取输入后,输出丢失了一个字符
- 如何在 c++ 中读取输入字符串,忽略空格
- 使用 docker 读取输入文件
- 如何在窗口上的命令行中读取输入 .in 文件
- 在 c++ 服务器上实时读取输入
- 使用不同类型的分隔符从.txt文件中读取输入
- 如何在读取 c++ 输入时脱离循环
- 尝试重复读取输入会出错
- 我的 Visual c++ 托管单元测试项目未读取输入文件
- C 读取输入,直到线char数组的结束
- C (Visual Studio):尝试从.txt文件读取输入时什么都没有收到
- 读取C++输入文件
- 如何从具有交替数据的文件中读取输入并存储到两个数组