为什么std :: istream_iterator会忽略换行符?

时间:2014-01-21 20:17:12

标签: c++

我有以下代码:

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

int main()
{
    std::stringstream str; str << "abc\ndef";

    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忽略了换行符?

3 个答案:

答案 0 :(得分:9)

因为istream_iterator使用operator>>。并且istream::operator>>(char)跳过空格,除非您取消设置流的skipws标志。 (例如使用noskipws

如果你这样做,你会获得相同的输出:

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

答案 1 :(得分:4)

您可以通过更改一些代码来禁用跳过输入中的任何空格:

std::stringstream str; str << std::noskipws << "abc\ndef";

新输出:

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

答案 2 :(得分:1)

改为使用std::istreambuf_iterator<char>,它不会丢失空格和换行符。