Ввод значений из потока строк - PullRequest
2 голосов
/ 21 ноября 2010

Есть ли цикл while, который позволяет мне вводить все значения для потока строк в некоторый тип данных? Например:

stringstream line;
while(/*there's still stuff in line*/)
{
    string thing;
    line >> thing;
    //do stuff with thing
}

1 Ответ

2 голосов
/ 21 ноября 2010

Да:

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().

...