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

Why std::istream_iterator ignores newline characters?

本文关键字:换行符 std istream 为什么 iterator      更新时间:2023-10-16

我有以下代码:

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

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

这与执行此操作时获得的输出相同:

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

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

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

新输出:

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

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