2015-02-11 74 views
1

我有以下结构:从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一个字。例如,如果输入是:

李Goswell路

的输出将是person.name = “李” 和person.address = “Goswell”。我想要的是基本上读取整个地址的功能。我曾尝试如下解决这个问题,但我不知道这是正确的,因为地址被隐式变化:

std::istream &read(std::istream &is, Person &person){ 
    is >> person.name; 
    std::getline(std::cin, person.address); 
    return is; 
} 

另一件事说我应该写独立的功能之前首先要考虑的任务是写一个函数读取名称和地址。

+2

'std :: getline(is,person.address)'。但是,如果您要混合运算符>>和std :: getline,则cin.ignore(std :: numeric_limits :: max,'\ n')。 – 2015-02-11 13:00:47

+0

@remyabel我想了解'ignore'的动机是什么? – 2015-02-11 14:24:46

回答

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; 
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'是默认值。

+0

如果我使用上述。当我输入return'is'时,getline的输入是否也会被函数返回?对不起,如果这是一个基本问题,我对理解iostream的工作方式有点麻烦。 – 2015-02-11 13:54:48

+0

@WalidBeydoun把'is'想象成一个字符串,其中有一个插入符号的字符,告诉它当前的位置。此代码将更新该插入位置。返回'is'对于链接操作符来说很关键,在'read'函数中不是必需的,但是我的'operator >>'必须返回'std :: istream&'以便你可以这样做:'foo >> person1 >> person2 >> person3;'每个操作符都使用前一个操作符返回的流。 – 2015-02-11 14:14:15

相关问题