读书人

小弟我定义的这个重载输入操作符哪里有

发布时间: 2012-03-11 18:15:38 作者: rapoo

我定义的这个重载输入操作符哪里有什么问题啊???

C/C++ code
................class student{    friend std::istream& operator>>(std::istream&,student&);    friend std::ostream& operator<<(std::ostream&,const student&);public:    student():s_name("*"),s_num("*"),s_class("*"){}    std::string s_name;             //姓名    std::string s_num;              //学号    std::string s_class;            //班级    std::map<std::string,double> s_score;//课程得分    double average;                    //平均成绩            };inline std::istream& operator>>(std::istream &in,student &rhs){    in>>rhs.s_name>>rhs.s_num>>rhs.s_class;    std::string kc;        //课程名字    double score=0.0;    //课程得分    while(in>>kc>>score)        rhs.s_score.insert(make_pair(kc,score));    return in;}................



C/C++ code
................int main(){    ifstream infile("d:\\sdt.txt");    string str_line;    student xuesheng;    while(getline(infile,str_line))    {        istringstream sin(str_line);        sin>>xuesheng;        cout<<xuesheng<<endl;    }}................



假设我sdt.txt文件里的内容是
游枭01初2003级1班数学 90 语文 100
王子02初2003级2班数学 80 语文 56
乌龟03初2003级3班数学 70 语文 64

程序运行后的结果就变成了
游枭01初2003级1班数学 90 语文 100
王子02初2003级2班数学 90 语文 100
乌龟03初2003级3班数学 90 语文 100


这是什么原因啊?

[解决办法]
把 student xuesheng; 这句话放到while循环里面就行了,原因你该清楚^_^
[解决办法]
student xuesheng;//attention *******************
while(getline(infile,str_line))
{
istringstream sin(str_line);
sin>>xuesheng;
cout<<xuesheng<<endl;
}

你每次都在对一个student对象(xuesheng)进行操作,当然会得出这样的结果。
执行in>>rhs.s_name>>rhs.s_num>>rhs.s_class;时,学生对象里的相关值会改变,
而执行rhs.s_score.insert(make_pair(kc,score))时,由于key为“数学”和“ 语文”的pair已经存在,第二三次插入不可能成功,
因此结果始终是 :“数学 90 语文 100”

修改方法:
//student xuesheng;
while(getline(infile,str_line))
{
student xuesheng;//attention *******************
istringstream sin(str_line);
sin>>xuesheng;
cout<<xuesheng<<endl;
}

读书人网 >C++

热点推荐