Странное поведение при использовании std::istringstream с оператором '››'

Я заметил странное поведение с очень простой программой чуть ниже.

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

int main(void)
{
    std::string data = "o BoxModel\nv 1.0f, 1.0f, 1.0f\nv 2.0f, 2.0f, 2.0f\n";
    std::istringstream iss(data);
    std::string line;
    std::string type;

    while (std::getline(iss, line, '\n'))
    {
        iss >> type;

        std::cout << type << std::endl;
    }
    getchar();
    return (0);
}

Вывод следующий:

v
v
v

Но я хочу следующее:

o
v
v

Я попробовал это решение:

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

int main(void)
{
    std::string data = "o BoxModel\nv 1.0f, 1.0f, 1.0f\nv 2.0f, 2.0f, 2.0f\n";
    std::istringstream iss(data);
    std::string line;
    std::string type;

    iss >> type;
    std::cout << type << std::endl;

    while (std::getline(iss, line, '\n'))
    {
        iss >> type;

        std::cout << type << std::endl;
    }
    getchar();
    return (0);
}

Но вывод следующий:

o
v
v
v

Кто-нибудь может мне помочь, пожалуйста? Заранее большое спасибо за вашу помощь.


person user1364743    schedule 01.10.2013    source источник
comment
Кажется, вы пытаетесь выполнить свой while (:   -  person Rubens    schedule 01.10.2013


Ответы (1)


После вызова getline вы удаляете первую строку из буфера потока строк. Слово в строке после первой новой строки — «v».

В цикле while создайте еще один поток строк со строкой в ​​качестве входных данных. Теперь извлеките из этого строкового потока ваше типовое слово.

while (std::getline(iss, line, '\n'))
{
    std::istringstream iss2(line);
    iss2 >> type;

    std::cout << type << std::endl;
}
person Neil Kirk    schedule 01.10.2013
comment
Большое спасибо за ваш ответ. До свидания. - person user1364743; 01.10.2013
comment
@user1364743 user1364743 Если это ответ на ваш вопрос, пожалуйста, примите его. Здесь, в StackOverflow, мы не говорим спасибо, мы голосуем и/или принимаем ответы. - person Ali; 01.10.2013