«Отключено на одну ошибку» при использовании istringstream в C++
-
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
Именно по этой причине вам всегда следует использовать второй подход, который вы показываете.При таком подходе цикл не будет введен, если чтение не удалось.