2015-02-11 55 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

相關問題