Да:
std::stringstream line;
std::string thing;
while (line >> thing)
{
// do stuff with thing
}
if (line.fail())
{
// an error occurred; handle it as appropriate
}
Потоковые операции (например, >>
) возвращают поток;это то, что позволяет вам связывать потоковые операции, например:
line >> x >> y >> z
Поток может использоваться как логическое значение;если поток находится в хорошем состоянии (то есть, если из него можно прочитать данные), он оценивается как true
;в противном случае он оценивается в false
.Вот почему мы можем использовать поток в качестве условия в цикле.
Существует ряд причин, по которым поток не будет в хорошем состоянии.
Один из них - это когда вы достигаете конца потока (указано тестированием line.eof()
);очевидно, если вы пытаетесь прочитать все данные из потока, это условие, в котором вы ожидаете, что поток будет, когда вы закончите.
Другие две причины, по которым поток не будет в хорошем состоянии, заключаются в том, что произошла какая-то внутренняя ошибка или произошла ошибка операции с потоком (например, если вы пытаетесь извлечь целое число, но следующие данные в потокене представляет собой целое число).Оба из них проверены line.fail()
.