2016-11-04 6 views
0

나는 내 클래스의 두 함수에 대한 코드를 잘못 작성했다고 확신한다. 나는 데이터의 두 부분을 올바르게 (x와 y) 받아들이고 그것들이 좋은 상태인지 확인하는 방법을 혼란 스럽다.혼란 IOStream에서 데이터가 "양호"하도록 만드는 방법

/** 
* Requires: ins is in good state. 
* Modifies: ins, x, y. 
* Effects: Reads point in form (x,y). 
*/ 
void read(istream& ins); 

/** 
* Requires: outs is in good state. 
* Modifies: outs. 
* Effects: Writes point in form (x,y). 
*/ 
void write(ostream& outs); 


void Point::read(istream& ins) { 
char junk; 
char junk2; 
char junk3; 
while (cin.good()) { 
    cin >> junk >> x >> junk2 >> y >> junk3; 
} 
} 

void Point::write(ostream& outs) { 
while (cout.good()) { 
    cout << "(" << x << "," << y << ")"; 
} 
} 
+0

'x'와 'y'는 무엇입니까? –

+0

좌표 (x, y)의 점입니다. – NICE8xxx

+0

아 하. 너 이제 나에게 완전히 깨달았다. 필요한 경우 실제 문제를 재현하는 [MCVE]를 게시 하시겠습니까? –

답변

0

istream's .bad() 기능을 사용하여 문제가 있는지 확인할 수 있습니다. "문제가 I/O 작업의 논리적 오류"(failbit) 또는 "I/O 작업의 읽기/쓰기 오류"(badbit) 일 수 있습니다.

이하는 cinins으로 바꿨습니다. 인수로 전달 했으므로 분명히 추출해야하는 객체는 istream입니다. 또한 접두어로 밑줄을 사용하여 지역 변수를 추가 한 다음 오류가없는 경우 xy으로 만 복사합니다.

오류가 발견되면 단순히 "반환"할 수 있지만 사용자에게 읽기 오류가 발생했으며 x/y은 건드리지 않았다는 표시가 없습니다. 또는 예외를 throw하도록 선택했지만 메시지를 cout/cerr (으)로 선택한 다음 반환하거나 void 반환을 사용하는 대신 결과 (성공/실패)를 반환하도록 선택할 수 있으며 호출 함수 오류를 처리하십시오. Point::write 함수의

void Point::read(istream& ins) { 
    char _junk; 
    int _x, _y; 

    ins >> _junk >> _x >> _junk >> _y >> _junk; 

    if (ins.bad()) 
    throw "Error"; 

    x = _x; // Assuming x and y are members of class Point 
    y = _y; 
} 

은 while 루프 귀찮게하지 않는다. 일반적으로 ostream 객체는 검사하지 않지만 실제로 원한다면 쓰기 전후에 .good()이 true인지 확인하십시오. 문제를 발견하면 원하는대로 오류를 처리 할 수 ​​있습니다. return, throw 예외가 발생하거나 오류가 기록됩니다.