Неожиданные разрывы строк в выводе

В этот ответ У меня есть следующий код:

#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;
}

Это вывод:

Спадина 76 156

Батерст 121 291

Кил 70 61

Бухта 158 158

Мой ожидаемый вывод не удваивает пробел:

Спадина 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.

Кто-нибудь может мне это объяснить?

3

Решение

operator >> возврате int не отбрасывает пробел после него, поэтому, когда _adultPass читается, следующий символ в потоке \n, Если вы тогда бежите getline это останавливается на ';'этот символ новой строки также читается и сохраняется в начале строки.

5

Другие решения


По вопросам рекламы [email protected]