2016-04-25 81 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