2012-11-04 93 views
1

下面是該計劃中,我重載「>>」操作符計劃是進入無限循環C++

#include<iostream> 
#include<fstream> 
#include<string> 
using namespace std; 

class Student{ 
    public : 
     string name; 
     string entry_no; 
}; 

class Science : public Student{ 
    public : 
    float marks; 
    void create_file(); 
    void highest(); 

    friend istream& operator >> (istream& input, Science& stud); 
}; 

istream& operator >> (istream& input, Science& stud){ 
    input >> stud.name; 
    input >> stud.entry_no; 
    input >> stud.marks; 
    return input; 
} 
void Science::create_file(){ 
    ifstream file_read; 

    file_read.open("student.txt"); 

    ofstream file_write; 
    file_write.open("science.txt"); 
    string line; 

    while(!file_read.eof()){ 
     getline(file_read,line,'\n'); 

     if(line.find("Science") != string::npos){ 
      file_write << line; 
      file_write << '\n'; 
     } 
    } 
} 

class Art : public Student{ 
    public : 
    string marks; 
    void create_file(); 
    void highest(); 
    friend istream& operator >> (istream& input, Art& stud); 
}; 

istream& operator >> (istream& input, Art& stud){ 
    input >> stud.name; 
    input >> stud.entry_no; 
    input >> stud.marks; 
    return input; 
} 

void Art::create_file(){ 
    ifstream file_read; 

    file_read.open("student.txt"); 

    ofstream file_write; 
    file_write.open("art.txt"); 
    string line; 

    while(!file_read.eof()){ 
     getline(file_read,line,'\n'); 

     if(line.find("Art") != string::npos){ 
      file_write << line; 
      file_write << '\n'; 
     } 
    } 
    file_read.close(); 
    file_write.close(); 
} 

void find_marks(){ 

    string entry_no; 
    cout << "Enter entry_no of the student to find marks " << endl; 
    cin >> entry_no; 

    ifstream file_read; 
    file_read.open("science.txt"); 
    string stud_entry; 
    Science stud; 
    bool found = false; 
    if(file_read.is_open()){ 
     cout << (file_read >> stud) << endl; 
    while(file_read >> stud){ 
     cout << "hi"; 
     if(!entry_no.compare(stud.entry_no)){ 
      cout << stud.marks << endl; 
      found = true; 
      break; 
     } 
    } 
    } 
    else 
     cout << "error in openning"<< endl; 

    if(!found) 
     cout << "this student does not exist" << endl; 
} 

int main(){ 
    Science science_stud; 
    Art art_stud; 

    science_stud.create_file(); 
    art_stud.create_file(); 
    find_marks(); 
    return 0; 
} 

這裏while循環功能find_marks()進入無限循環,如果entry_no不匹配。任何人都可以解釋爲什麼它發生?

+5

你的while循環應該是'while(file_read >> stud)'。 – chris

+0

我懷疑你讀取你的文件時出錯,但不是eof。你能舉一個science.txt文件的小例子嗎? –

回答

7

eof()的測試僅對確定是否因爲上一次轉換失敗而想要打印錯誤非常有用。這是一個非常糟糕的循環條件:

  1. 它不一定達到。例如,如果轉換在某個時候失敗,則流轉爲失敗狀態,拒絕進一步提取字符,直到狀態被清除。
  2. 當達到EOF(至少不能保證設置)時,std::ios_base::eofbit標誌未設置,但只有在試圖讀取超過文件末尾時才能保證設置。因此,最後一組數據傾向於被處理兩次。

正確的方法是隻使用轉換爲bool之後數據讀取:

while (file >> whatever) { 
    ... 
} 

如果你的C++教程建議您使用eof()你應該燃燒,並勸別人不要購買副本(他們需要刻錄)。如果你的老師告訴你使用eof() - ...好吧,這是我的理解,燃燒的人已經過時了。至少,你應該告訴他他錯了。

+0

+1一般來說似乎是一個可怕的人 –

+0

我用上面的條件,但在那種情況下,它永遠不會進入循環 – neel

+0

@neel你檢查文件是否成功打開? – moooeeeep