输出中出现意外的换行符

时间:2015-02-13 12:31:08

标签: c++ c++11 line-breaks cout extraction-operator

this answer中,我有以下代码:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
#include <limits>

using namespace std;

struct station{
    string _stationName;
    int _studentPass;
    int _adultPass;
};

std::istream& operator>>(std::istream& is, station& rhs){
    getline(is, rhs._stationName, ';');
    is >> rhs._studentPass >> rhs._adultPass;
    return is;
}

int main(){
    istringstream foo("4;\nSpadina;76 156\nBathurst;121 291\nKeele;70 61\nBay;158 158");

    foo.ignore(numeric_limits<streamsize>::max(), '\n');

    vector<station> bar{ istream_iterator<station>(foo), istream_iterator<station>() };

    for (auto& i : bar){
        cout << i._stationName << ' ' << i._studentPass << ' ' << i._adultPass << endl;
    }

    return 0;
}

它的输出是:

  

Spadina 76 156
  
  巴瑟斯特121 291
  
  基尔70 61
  
  海湾158 158

我的预期输出不会增加一倍:

  

Spadina 76 156
  巴瑟斯特121 291
  基尔70 61
  海湾158 158

如果我将operator>>更改为:

,我会得到预期的输出
std::istream& operator>>(std::istream& is, station& rhs){
    if (is >> rhs._stationName >> rhs._adultPass){
        auto i = rhs._stationName.find(';');

        rhs._studentPass = stoi(rhs._stationName.substr(i + 1));
        rhs._stationName.resize(i);
    }
    return is;
}

这似乎是一个编译器错误或其他东西,但这很奇怪,因为我在Visual Studio 2013 gcc 4.9.2中都看到了这种行为。

任何人都可以向我解释这个吗?

1 个答案:

答案 0 :(得分:5)

operator >>返回int后不会丢弃空格,因此在读取_adultPass时,流中的下一个字符为\n。然后,如果您运行getline停止在';',则会读取此换行符并将其存储在字符串的开头。