簡體   English   中英

布爾函數無法從文本文件中讀取所有輸入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM