从Istream中阅读,如何先读一个单词,然后读整行,然后返回



我有以下结构:

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'

相关内容

  • 没有找到相关文章

最新更新