2013-06-18 187 views
1

我的輸入文件由2行數字分隔的空格組成。我必須從兩行讀取數字並將它們存儲在兩個不同的std::vector s中。但我不知道每行有多少個數字。我如何確保在閱讀第一行時我還沒有開始閱讀第二行的數字?我試着閱讀他們的字符串,並檢查「\n」字符,但它不工作....輸入時遇到問題

cin>>str; 
    while(str[0]!='\n' && str!="") { 
     sscanf(str.c_str(),"%d",&num); 
     numz.push_back(num); //numz is the vector for the first line of numbers 
     cin>>str; 
    } 

有一些巧妙的方式做到這一點?

回答

3

以下內容將一行讀入向量中。當然,你應該添加錯誤檢查。

std::vector<int> readnumline(std::istream& is) 
{ 
    std::string line; 
    std::getline(is, line); 
    std::istringstream iss(line); 
    int num; 
    std::vector<int> result; 
    while(iss >> num) 
    result.push_back(num); 
    return result; 
} 

要讀取兩個向量,就可以使用

std::vector<int> v1(readnumline(std::cin)); 
std::vector<int> v2(readnumline(std::cin)); 
+0

這一切都開始如此順利......但實際讀入向量可以簡化一點(或至少從代碼中去掉循環):'/ * .. 。*/std :: istringstream iss(line); return std :: vector (std :: istream_iterator (iss),std :: istream_iterator <>());' –

+0

@DavidRodríguez-dribeas:雖然該版本較短,但很難爲其添加適當的錯誤處理(for例如,您需要檢查實際上完整的行是否已被使用;您當然不希望將解析放入return語句中)。另外,我不認爲一個循環是邪惡的。如果他們沒有給他們這麼長的名字,我肯定會更經常地使用'istream_iterator' ;-)(也許​​他們應該給流模板化'begin' /'end',所以你可以寫' ()'和'iss.end ()')。 – celtschk

+0

不久之前(兩三週),在標準郵件列表中討論了可能增加的'begin' /'end',特別是意圖是支持基於範圍的迭代。它似乎不適合那個特定的用例(沒有可以傳遞的模板參數)不確定這個模板方法是否會更好地被接受,但是如果是這種情況,我會感到驚訝。新的不同的東西。 –

3

#include <sstream>訪問std::istringstream
然後代碼應該是這樣的:

std::string line1; 
std::string line2; 

std::getline(std::cin, line1); 
std::getline(std::cin, line2); 

int x; 
std::vector<int> v; 
std::istringstream iss(line1); 
while (iss >> x) { 
    v.push_back(x); 
} 

首先我們先讀使用getline兩條線,那麼你創建一個istringstream對象,它的工作原理就像是std::cin

+0

你能PLZ指定我怎樣才能從這些數字呢?使用strtok? – ofey

+0

我認爲流操作符工作,現在測試它 –