Почему std::istream_iterator игнорирует символы новой строки?

#c

Вопрос:

У меня есть следующий код:

 #include <sstream>
#include <iterator>
#include <iostream>

int main()
{
    std::stringstream str; str << "abcndef";

    std::cout << "[" << str.str() << "]" << std::endl;

    std::istream_iterator<char> it(str), end;

    for (; it != end;   it)
    {
        std::cout << "[" << unsigned(*it) << "]";
    }

    std::cout << std::endl;

    return 0;
}
 

И результат таков:

 [abc
def]
[97][98][99][100][101][102]
 

Почему std::istream_iterator проигнорировал символ новой строки?

Ответ №1:

Потому istream_iterator что использует operator>> . И istream::operator>>(char) пропускает пробелы, если вы skipws не снимите флаг потока. (например, с помощью noskipws )

Это тот же результат, который вы получили бы, если бы сделали это:

 char c;
while (str >> c)
    std::cout << "[" << unsigned(c) << "]";
 

Ответ №2:

Вы можете отключить пропуск любых пробелов во входных данных, изменив немного свой код:

 std::stringstream str; str << std::noskipws << "abcndef";
 

Новый результат:

 [abc
def]
[97][98][99][10][100][101][102]
 

Ответ №3:

Используйте std::istreambuf_iterator<char> вместо этого, это не приведет к потере пробелов и новых строк.