1

我有以下结构:

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. 例如,如果输入是:

利高斯威路

输出将是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;
}

在说我应该编写单独的函数之前要考虑的另一件事是,任务是编写一个函数来读取名称和地址。

4

2 回答 2

0

只需阅读一个单词,跳过前导空格,然后阅读到分隔符:

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'作为默认值。

于 2015-02-11T13:35:53.567 回答
0

您可以operator>>同时使用,std::getline但您可能想先从流中吃掉空白。

另外read,您应该创建自己的operator>>

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 Road\nJon Lois Lane");
Person bar;

foo >> bar;

std::cout << bar.name << std::endl << bar.address << std::endl;
于 2015-02-11T13:33:24.940 回答