输出中意外的换行
Unexpected Line Breaks in Output
在中我有以下代码:
#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
Bathurst 121 291
Keele 70 61
Bay 158 158
我的预期输出没有翻倍space:
Spadina 76 156
Bathurst 121 291
Keele 70 61
Bay 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 中都看到了这种行为。
谁能给我解释一下吗?
operator >>
返回 int
不会丢弃其后的空格,因此当读取 _adultPass
时,流中的下一个字符是 \n
。如果您然后 运行 getline
停止在 ';'
,这个换行符也会被读取并存储在字符串的开头。
在
#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
Bathurst 121 291
Keele 70 61
Bay 158 158
我的预期输出没有翻倍space:
Spadina 76 156
Bathurst 121 291
Keele 70 61
Bay 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 中都看到了这种行为。
谁能给我解释一下吗?
operator >>
返回 int
不会丢弃其后的空格,因此当读取 _adultPass
时,流中的下一个字符是 \n
。如果您然后 运行 getline
停止在 ';'
,这个换行符也会被读取并存储在字符串的开头。