2014-01-21 104 views
3

我有以下代碼:爲什麼std :: istream_iterator忽略換行符?

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

回答

7

因爲istream_iterator使用operator>>。並且istream::operator>>(char)會跳過空格,除非您取消設置流的skipws標誌。 (例如,使用noskipws

這是相同的輸出,如果你這樣做,你會得到:

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

您可以禁用通過改變代碼的一點點跳過輸入任何空白:

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

新產出:

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