C++에서 파일입출력 관련 질문입니다ㅠ

view88의 이미지

간단한 프로그램을 하나 짜던 도중 도저히 이해할수없는 상황이 발생해서 이렇게 질문을 올리게 되었습니다.

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;

}

정말 답답하네요ㅠㅠ

문제점을 정확하게 알고싶습니다ㅠ

고수님들 가르쳐주세요~ㅜ

klara의 이미지

이게 원인인지는 모르겠지만, 연산자 오버로딩이 잘못되었습니다.
ifstream operator >>(ifstream fin,Polynomial poly)로 되어있기 때문에, 두가지 문제가 있습니다.

1. poly는 복사된 임시객체이기 때문에, poly에 아무리 값을 설정해줘도, 여기서 지정한 값은 남지 않고 함수가 종료됨과 동시에 없어집니다. 레퍼런스로 받아줘야합니다.
2. fin역시 복사하고 있는데, 이부분은 정확하지 않지만, 파일 입출력 객체의 복사에 대해서는 들은 바가 없고, 복사 생성자나 대입연산자등이 정의되어있지 않다면(제가 알기론 정의되어있지 않습니다) 제대로 복사되지 않을 수있습니다. 보통 입출력 객체에 대한 연산자 오버로딩 역시 레퍼런스로 이루어집니다.

따라서 원형은 ifstream &operator >>(ifstream &fin,Polynomial &poly)로 고쳐야합니다.

view88의 이미지

원래 코드에는 레퍼런스로 넘겨받고 리턴했었습니다...ㅠㅠ
원문 수정했습니다;;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.