2016-08-29 2 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 ответ])
Теперь мне нужно перебрать файл с помощью Lines и ColorfulLines:

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

Объяснением причин downvote будет оценен. –

+0

Я не спустил вниз, но я бы сделал ставку, потому что вы разместили соответствующий код вне сайта, а не прямо в своем вопросе. (Пожалуйста, не делайте этого в будущем.) – ildjarn

+0

@ildjarn релевантный код все в вопросе, я пропустил только перегрузку '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' '' '' '' ' (и, конечно, int main и co.). Я ошибаюсь? Я подумал, что было бы лучше, если бы я оставил здесь только самые важные части, а не весь мусор. –

ответ

5

После первых перерывов цикла std::cin находится в плохом состоянии. Вот почему петля ломается в первую очередь. Выполнение чтения в плохом потоке происходит немедленно, поэтому второй цикл никогда не вводится.

Чтобы решить эту проблему, сбросить состояние ошибки после первого цикла с перерывами

std::cin.clear(); 
Смежные вопросы