#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>
вместо этого, это не приведет к потере пробелов и новых строк.