Неожиданный вывод при чтении из getline в непустую строку

Меня смущает функция "istream& getline (istream& is, string& str)" и согласно http://www.cplusplus.com/reference/string/string/getline/, следующая программа:

#include <iostream>
#include <sstream>

int main()
{
    std::istringstream s("this is a test");
    std::string line = "line ";
    getline( s, line );
    std::cout << line << std::endl;
    s.str("test again");
    getline( s, line );
    std::cout << s.str() << std::endl;
    std::cout << line << std::endl;

    return 0;
}

Я ожидаю, что вывод будет:

строка это тест

проверить еще раз

проверить еще раз

но когда я тестирую его в Visual Studio, вывод:

это тест

проверить еще раз

это тест

Может ли кто-нибудь объяснить мне разочаровывающую функцию?


person JavaBeta    schedule 19.09.2013    source источник


Ответы (2)


Очистите флаги ошибок между вызовами getline:

int main()
{
    std::istringstream s("this is a test");
    std::string line = "line ";
    getline( s, line );
    std::cout << line << std::endl;
    s.str("test again");
    s.clear()   // <<<--------------- to clear error flags
    getline( s, line );
    std::cout << s.str() << std::endl;
    std::cout << line << std::endl;

    return 0;
}

Первый getline устанавливает eofbit в потоке. Затем второй выходит из строя, и line остается нетронутым.

С исправлением вы получите:

this is a test
test again
test again

поскольку getline не добавляется к строке, она заменяет содержимое.

person jrok    schedule 19.09.2013