«Отключено на одну ошибку» при использовании istringstream в C++

StackOverflow https://stackoverflow.com/questions/8983079

  •  13-11-2019
  •  | 
  •  

Вопрос

Я получаю ошибку на одну ошибку при выполнении следующего кода

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main (int argc, char* argv[]){
    string tokens,input;
    input = "how are you";
    istringstream iss (input , istringstream::in);
    while(iss){
        iss >> tokens;
        cout << tokens << endl;
    }
    return 0;

}

Он дважды распечатывает последний токен «вы». Однако, если я внесу следующие изменения, все будет работать нормально.

 while(iss >> tokens){
    cout << tokens << endl;
}

Может ли кто-нибудь объяснить мне, как работает цикл while.Спасибо

Это было полезно?

Решение

Это верно.Состояние while(iss) терпит неудачу только после того, как вы прочитаете конец потока.Итак, после того, как вы извлекли "you" из вашего потока, это все равно будет правдой.

while(iss) { // true, because the last extraction was successful

Итак, вы пытаетесь извлечь больше.Это извлечение завершается неудачно, но не влияет на значение, хранящееся в tokens, поэтому он печатается снова.

iss >> tokens; // end of stream, so this fails, but tokens sill contains
               // the value from the previous iteration of the loop
cout << tokens << endl; // previous value is printed again

Именно по этой причине вам всегда следует использовать второй подход, который вы показываете.При таком подходе цикл не будет введен, если чтение не удалось.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top