Что >> делает при использовании с потоком строк? - PullRequest
0 голосов
/ 11 октября 2019

Я читал следующий пример кода:

std::array<int, 4> parseMessage(const std::string& input) {
    std::stringstream ss(input);
    std::array<int, 4> message;
    int n;
    // Loop over all characters in the string and ignore the semicolons.
    for (int i = 0; ss >> n && i < 4; ++i) {
        message[i] = n;
        if (ss.peek() == ';') {
            ss.ignore();
        }
    }
    return message;
}

Может кто-нибудь объяснить, почему кто-то делает ss >> n в области условия цикла? Это выглядит немного странно для меня.

Ответы [ 2 ]

4 голосов
/ 11 октября 2019

Сначала он прочитает int из потока, а затем оценит, хорош ли поток. (потому что s >> n вернет ссылку на s).

Оценка потока как bool:

Возвращает true, если поток не содержит ошибок и готов к I /O операции. В частности, возвращает! Fail ().

Таким образом, как только поток не может прочитать int или достигнет конца потока (например, конца ввода), он будет оценен как false и завершит цикл.

Таким образом, этот код будет извлекать до 4-х дюймов из заданного ввода (4 из-за && i < 4).

1 голос
/ 11 октября 2019

>> считывает переменную в правой части выражения и возвращает поток.

Использование потока в логическом выражении возвращает информацию о том, произошел ли поток с ошибкой.

Следовательно, цикл for эквивалентен:

int i = 0;
while ( i < 4 )
{
  ss >> n;
  if ( ss.fail() )
  {
    break;
  }
  message[i] = n;
  if (ss.peek() == ';') {
     ss.ignore();
  }
  i++;
}

. Он считывает до 4 чисел и останавливается, если содержимое потока не может быть преобразовано в число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...