以下是我重载“>>”的程序运营商
#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;
}
这里,如果entry_no不匹配,函数find_marks()中的循环进入无限循环。谁能解释为什么会这样?
答案 0 :(得分:7)
测试eof()
对于确定是否要打印错误非常有用,因为之前的转换失败了。这是一个非常糟糕的循环条件:
std::ios_base::eofbit
标志不会被设置(至少,它不能保证设置),但只有在尝试读取过去时才会保证设置文件的结尾。因此,最后一组数据往往会被处理两次。正确的方法是在读取数据后使用转化为bool
:
while (file >> whatever) {
...
}
如果您的C ++教程建议您使用eof()
,您可能应该刻录它并建议其他人不要购买副本(他们需要刻录)。如果你的老师告诉你使用eof()
- 那么,我的理解是,燃烧的人已经过时了。你应该至少告诉他他错了。