c++ - I am trying to make a robust class that can handle any erroneous input. it works fine until the last number in the file -
#ifndef rationalnumber_h #define rationalnumber_h #include<iostream> using namespace std; class rationalnumber { friend ostream &operator<<(ostream &out,rationalnumber &r); friend istream &operator>>(istream &in,rationalnumber &r); private: int numerator; int denominator; public: rationalnumber(int n,int d); rationalnumber(); operator void*(){return (numerator== 0 ? null :this);} }; #endif #include"rationalnumber.h" #include<stdexcept> #include<cmath> rationalnumber::rationalnumber():numerator(1),denominator(1) { } rationalnumber::rationalnumber(int n,int d):numerator(n),denominator(d) { if(denominator==0) throw runtime_error("cant divide zero"); } ostream &operator<<(ostream &out,rationalnumber &r) { if(r.denominator == 1 || r.denominator == -1 && r.numerator !=0) { if(r.denominator<0 && r. numerator <0) out<<abs(r.numerator); else if(r.denominator<0 || r.numerator<0) out<<"-"<<abs(r.numerator); else out<<r.numerator; } else if(abs(r.denominator) == abs(r.numerator)) { if(r.denominator<0 && r. numerator <0) out<<"1"; else if(r.denominator<0 || r.numerator<0) out<<"-"<<"1"; else if(r.denominator == 0 && r.numerator ==0) out<<"nothing"; else out<<"1 "; } else if(r.numerator<0 && r.denominator >0 ||r.numerator>0 && r.denominator<0) out<<"-"<<abs(r.numerator)<<"/"<<abs(r.denominator); else if(r.numerator<0 && r.denominator<0) out<<abs(r.numerator)<<"/"<<abs(r.denominator); else if(r.numerator ==0) out<<r.numerator; else if(r.numerator>0 && r.denominator>0) out<<r.numerator<<"/"<<r.denominator; else if(r.numerator ==null && r.denominator == null) out<<" nothing "<<endl; return out; } istream &operator>>(istream &in,rationalnumber &r) { int top; int bottom; char divide; r.numerator = 0; r.denominator = 0; in>>top; if(in) { r.denominator = 1; while (isspace(divide = in.peek())&& divide != '\n') in.get(); if(divide !='\n') { if(divide =='/') { in>>divide; while (isspace(bottom = in.peek())) in.get(); in>>bottom; if(!in || bottom==0) { r.numerator=top; in.clear(ios::failbit); } else { r.numerator=top; r.denominator=bottom; } } else { r.numerator=top; in.clear(ios::failbit); } } else { r.numerator = top; } } else in.clear(ios::failbit); return in; }
/////////////////////////////////////////////////////////////////////////////////////////////////////
12/34 */this file im reading in from. class supposed 12 rational number class 23 23 read correctly without causing error.it 34 giving me problems last number in file. im not sure 23 whats going on*/
/////////////////////////////////////////////////////////////////////////////////////////////////////
Comments
Post a Comment