2016-08-29 6 views
-1

더 복잡한 객체와 CIN :표준 : 내가 처음 몇 줄을 설명하고 몇 가지 다채로운 라인을 설명하는 텍스트 파일이

1 2 3 4 
5 6 7 8 
9 10 11 12 

red 1 0 0 1 2 3 4 
green 0 1 0 5 6 7 8 
blue 0 0 1 9 10 11 12 
는 각 섹션의 행의 수는 실행시에 알 수없는입니다


나는 이러한 구조체의 std::cin >> 연산자를 오버로드 :

struct Point { int x, y; } 
struct Line { Point a, b; } 
struct Color { float r, g, b; std::string name; }; 
struct ColorfulLine { Line line; Color color; }; 

(전체 예 여기 : http://ideone.com/bMOaL1이 [이미 작동 - 편집 전열에 따라 pted 답]) 지금은 LinesColorfulLines을 사용하여 파일을 반복 할 필요가
: 여기

Line line;              
while(cin >> line) { cout << "We've got a line!\n"; }    

ColorfulLine color_line;           
while(cin >> color_line) { cout << "We've got a colorful line!\n"; } 

// actually I'm putting them into std::lists but I skipped this part for simplicity 

그리고

문제입니다 - 화려한 라인, 즉 두 번째 루프가 실행되지 않습니다를 가져온 적이 없습니다. std::cin 시도가 4 선을 가져올 때
, 그것은 때문에 대신 문자열 "빨간색"거기에 다수의 실패

나는 가정 이유는하지만 그것을 해결하는 방법을 모르는 일이 발생있다.
두 번째 while 루프에서 std :: cin은 문자열 (Color.name)을 읽으려고 시도하지만 숫자를보고 실패합니다.

첫 번째 루프가 실패하면 두 번째는 "빨간색"문자열에서 읽기 시작하지만 ColorfulLines 섹션 앞에 임의의 단어를 넣으려고했습니다.

해결 방법?

+0

설명과 함께 제 1 루프 휴식 후 오류 상태를 리셋한다. –

+0

나는 downvote하지 않았지만 직접 질문 대신 오프 사이트에서 관련 코드를 게시했기 때문에 내기를 걸었습니다. (나중에 이것을하지 말아라.) – ildjarn

+0

@ildjarn 관련 코드가 모두 문제가된다. 필자는 불필요한'>>'연산자 오버로드를 생략했다. (물론 int main과 co.). 내가 잘못? 나는 여기서 가장 중요한 부분만을 남겨 두는 것이 좋을 것이라고 생각했다. –

답변

5

첫 번째 루프가 끊어진 후에 std::cin의 상태가 잘못되었습니다. 그래서 루프가 처음부터 중단됩니다. 불량 스트림에 대한 읽기 수행이 즉시 실패하므로 두 번째 루프는 입력되지 않습니다.

이 해결 이해할 것이다 downvote 이유의

std::cin.clear();