我有以下结构:
struct Person{
std::string name;
std::string address;
std::string& personName(){ return name; }
std::string& personAddress(){return address;}
};
练习是编写一个读取函数,读取名称和地址。例如,我第一次写的函数是:
std::istream &read(std::istream &is, Person &person){
is >> person.name >> person.address;
return is;
}
然而,此函数不能为address
占用多于一个单词的空间。例如,如果输入为:
Lee Goswell Road
输出为person.name
="Lee"和person.address
="Goswell"。我想要的是基本上读取整个地址的功能。我确实尝试如下解决这个问题,但我不确定它是否正确,因为地址被隐式更改:
std::istream &read(std::istream &is, Person &person){
is >> person.name;
std::getline(std::cin, person.address);
return is;
}
在说我应该写单独的函数之前,需要考虑的另一件事是写一个函数来读取名称和地址。
您可以将operator>>
与std::getline
一起使用,但您可能想先从流中占用空白。
此外,您应该创建自己的operator>>
:,而不是read
std::istream& operator>>(std::istream& is, Person& person){
is >> person.name >> std::ws;
std::getline(is, person.address);
return is;
}
然后您可以按如下方式使用:
std::istringstream foo("Lee Goswell RoadnJon Lois Lane");
Person bar;
foo >> bar;
std::cout << bar.name << std::endl << bar.address << std::endl;
只需读取一个单词,跳过前导空格,然后读取到分隔符:
if (is >> person.name >> std::ws
std::getline(is, person.address)) {
// do something with the input
}
else {
// deal with input failure
}
std::ws
只是跳过前导空白,std::getline()
读取分隔符,默认值为'n'
。