2012-03-09 139 views
0

我使用函數getline抓住從看起來像這樣忽略空格字符

1 9 
5 5 
6 7 
... 

其中第一個數字兄弟姐妹的人的數量已經和第二個數字是別人的年齡輸入數據文件中的行。

const int MAXLINE=50; 

int main(int argc, char *argv[]) { 

    int numberOfSiblings; 
    int age; 

    char oneline[MAXLINE]; 

    ifstream inputData; 
    inputData.open(argv[1]); 

    while (!(inputData.eof())) { 

     inputData.getline(oneline, MAXLINE); 

     numberOfSiblings = oneline[0] - '0'; 
     age = oneline[2]-'0'; 

    } 

} 

Howerver,我不能假設這些整數將始終是相同的指數,由於白色空間。

因爲如果有兩個空格而不是一個年齡現在將在索引3中。我該如何解釋?

此外,如果我有一個雙位數字會發生什麼?

+1

可能重複[如何在C++中拆分字符串?](http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c) – talnicolas 2012-03-09 01:17:43

+3

請閱讀[爲什麼' iostream :: eof'內循環條件認爲是錯誤的?](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – Xeo 2012-03-09 01:21:11

回答

2

讓標準流爲你做:

inputData >> numberOfSiblings >> age; 
+0

這是偉大的,工程,但現在它會導致一個奇怪的錯誤,最後一行由於某種原因被讀兩次......任何想法爲什麼? – DomX23 2012-03-09 02:36:56

+0

@ DomX23 - 因爲你的輸入循環不正確。不要使用'eof()'或'good()'作爲循環條件。首選:'while(inputData >> numberOfSiblings >> age){/ * work goes here * /}'。 – 2012-03-09 03:42:30

+0

我不能這樣做的唯一原因是因爲第一行我正在接受int numberOfPeople的不同輸入,而其餘數據文件包含numberOfSiblings和age。所以我做了檢查,看看我們是否在線1,如果是的話,我抓住numberOfPeople,如果我們在線1>我搶其餘。有沒有另一種方法來做到這一點,而不是使用eof()? – DomX23 2012-03-09 03:54:02

1

的std :: istream的已經有operator>>跨越任何前導空格跳過,然後讀一個int爲您服務。這似乎是你需要的,所以我只是使用它。

如果我這樣做,我會用一個結構開始代表一個人的數據:

struct data { 
    int num_siblings; 
    int age; 
}; 

然後我會寫一個函數來閱讀這些項目中的一個:

std::istream &operator>>(std::istream &is, data &d) { 
    return is >> d.num_siblings >> d.age; 
} 

有了這一點,你可以使用operator>>閱讀從流data項目:

std::ifstream input("people.txt"); 

data person; 
input >> person; 
0

有很多很好的答案。

但是,我認爲,如果你想使用&學習C++,

你最好使用「< <」或「>>」來幫助你做你的工作。

在答案,他們用覆蓋運營商,你可以從HERE學習|| HERE