2016-04-25 117 views
0

我的代碼:C++程序讀取文件

void load_books(){ 
ifstream myfile(path, ios::in); 
if (myfile.fail()){ 
    cout << "coudln't open file" << "\n\n"; 
} 
else{ 

    while (myfile){ 
     myfile >> book1[i].id >> book1[i].title >> book1[i].p_name >> book1[i].p_address >> book1[i].aut_name; 
     myfile >> book1[i].aut_nationality >> book1[i].date >> book1[i].status; 


     cout << book1[i].id << "\ " << book1[i].title << "\ " << book1[i].p_name << "\ " << book1[i].p_address << "\ " << book1[i].aut_name; 
     cout << "\ " << book1[i].aut_nationality << "\ " << book1[i].date << "\ " << book1[i].status << endl; 
     i++; 

    } 
    myfile.close(); 
} 

} 

應該輸出什麼文件包含但我得到這個命令

111·艾哈邁德·優素福大聲笑否是哈立德·15

222 adas asd sdt huy mjmj mjg2 20

的前兩行是正確的,但我不知道爲什麼它輸出的最後2個零(0)

+0

您閱讀前檢查。 – LogicStuff

+0

@LogicStuff我不明白!我是新的文件 –

+1

請考慮超載'>>'您的書類。 – erip

回答

2

爲了充實@Bo's answer,並回答您的comment

,以及如何我每次嘗試輸入之後檢查MYFILE的狀態??!

您可以修復你的循環是這樣的:

void load_books(){ 
    ifstream myfile(path); 
    if (myfile.fail()){ 
     cout << "coudln't open file" << "\n\n"; 
    } 
    else{ 
     while (myfile >> book1[i].id >> book1[i].title >> book1[i].p_name 
         >> book1[i].p_address >> book1[i].aut_name 
         >> book1[i].aut_nationality >> book1[i].date >> book1[i].status){ 

      cout << book1[i].id << "\ " << book1[i].title << "\ " << book1[i].p_name << "\ " 
       << book1[i].p_address << "\ " << book1[i].aut_name << "\ " 
       << book1[i].aut_nationality << "\ " << book1[i].date << "\ " 
       << book1[i].status << endl; 
      i++; 
     } 
    } 
} 

由於std:istream& operator>>(std:istream&, T&)返回當前std:istream&參考的鏈式調用,在while()循環的條件就可以解決的std::basic_ios::operator bool,和該環路將在操作員評估爲false後儘快結束。

相關參考文獻:

+0

非常感謝它的工作 –

2

條件while(myfile)只會停止後,一些輸入失敗。

此時,您已經從該輸入嘗試打印了零。

你必須檢查的myfile狀態每次嘗試輸入後,看它是否成功。

+0

以及我在每次嘗試輸入後如何檢查*** myfile ***的狀態?! –

+1

@david_dd你可以鏈接兩個'>>'語句並將它們移入循環條件,或者'if(!myfile)break;'。 – LogicStuff