[英]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是導致您的程序每隔第二行覆蓋一次,例如myMovie [1]將首先包含“ Layer Cake”,但在while()
執行該函數后,它將被“ RocknRolla”覆蓋。 最簡單的解決方法是刪除第二個readMovieInfo調用,這是已經回答的另一個答案,剩下的是:
while (myMovie[i].readMovieInfo(inFile)) i++;
由於您在循環條件中以及循環體中都調用readMovieInfo
,因此對於每個索引(0除外)都將調用兩次。
由於您在每次迭代中在第二次調用之前增加i
,因此您將用第三個元素覆蓋第二個元素,用第五個元素覆蓋第四個元素,依此類推:您將丟失輸入文件中的所有其他電影。 這反映在您的輸出中:第二和第四部電影消失了。
請記住,您的循環條件在每次迭代時都會進行測試,因此您需要注意條件測試的任何副作用。
您可以通過刪除對readMovieInfo
一個或另一個調用來解決此readMovieInfo
(作為一種練習,嘗試兩種方式都做),但是我更希望看到您while
不調用readMovieInfo
情況下編寫了while
條件; 完成此操作后,請考慮執行do / while循環是否會更好,以及原因。
最后,請注意,您還應檢查讀取的元素數量是否超出數組可容納的數量。 執行此操作時,循環條件將變得更加復雜。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.