C++에서 파일입출력 관련 질문입니다ㅠ
간단한 프로그램을 하나 짜던 도중 도저히 이해할수없는 상황이 발생해서 이렇게 질문을 올리게 되었습니다.
for(int i=0;i<numofPoly;i++) {
char nameofPoly;
int num;
fin>> nameofPoly >> num;
sumname+= nameofPoly;
Polynomial tmppoly = Polynomial(num);
fin>> tmppoly;
respoly += tmppoly;
}
위 코드가 문제가 생긴 코드입니다.
fin에서 입력을 받으려고 하는데 맨처음에 한번 받을때는 이상없이 잘 읽어들였습니다.
그런데 두번째 읽어들이려고 할때는 아무것도 읽어들이지못하고 그냥 넘어가버리더군요;
디버깅모드로 확인해보니 분명히 fin의 스트림포인터의 위치는 제대로 다음에 읽어야하는 곳을 가리키고 있었는데 말이죠;;
일단 제가 지금 의심하고 있는 부분은 위 코드에서 '이탤릭체 + 볼드체' 로 표시한 연산자 오버로딩부분인데요
밑에있는 코드가 오버로딩 함수의 코드입니다.
ifstream& operator >>(ifstream& fin,Polynomial& poly) {
int tmpcoeff , tmpexponent;
fin>> tmpcoeff >> poly.maxexponent;
poly.coeff= new int[poly.maxexponent+1];
for(int i=0;i<=poly.maxexponent;i++)
poly.coeff[i]= 0;
poly.coeff[poly.maxexponent]= tmpcoeff;
for(int i=0;i<poly.numofsubject;i++)
{
fin>> tmpcoeff >> tmpexponent;
poly.coeff[tmpexponent]= tmpcoeff;
}
return fin;
}
정말 답답하네요ㅠㅠ
문제점을 정확하게 알고싶습니다ㅠ
고수님들 가르쳐주세요~ㅜ
이게 원인인지는
이게 원인인지는 모르겠지만, 연산자 오버로딩이 잘못되었습니다.
ifstream operator >>(ifstream fin,Polynomial poly)로 되어있기 때문에, 두가지 문제가 있습니다.
1. poly는 복사된 임시객체이기 때문에, poly에 아무리 값을 설정해줘도, 여기서 지정한 값은 남지 않고 함수가 종료됨과 동시에 없어집니다. 레퍼런스로 받아줘야합니다.
2. fin역시 복사하고 있는데, 이부분은 정확하지 않지만, 파일 입출력 객체의 복사에 대해서는 들은 바가 없고, 복사 생성자나 대입연산자등이 정의되어있지 않다면(제가 알기론 정의되어있지 않습니다) 제대로 복사되지 않을 수있습니다. 보통 입출력 객체에 대한 연산자 오버로딩 역시 레퍼런스로 이루어집니다.
따라서 원형은 ifstream &operator >>(ifstream &fin,Polynomial &poly)로 고쳐야합니다.
헛 코드를 옮기면서 빠져있었네요;;
원래 코드에는 레퍼런스로 넘겨받고 리턴했었습니다...ㅠㅠ
원문 수정했습니다;;
댓글 달기