2008-10-19 58 views
3

我正在解析一個輸入文本文件。如果我使用getline()一次獲取輸入的一行,是否有一種方法可以搜索字符串以獲取整數?我正在考慮類似於Java中的getNextInt()。從一行解析整數

我知道在該輸入行中必須有2個數字;然而,這些值將被一個或多個空格字符分隔,所以我不能只是去特定的位置。

回答

4

如果在那裏的唯一事情是空白和整數,只要嘗試這樣的事:

int i1, i2; 
stringstream ss(lineFromGetLine); 
ss >> i1 >> i2; 

或更容易:

int i1, i2; 
theFileStream >> i1 >> i2; 
+0

如何做它的字符串不char * – Yoda 2012-06-19 12:18:32

+1

@羅伯特:我不知道你的投訴是什麼。你可以像`std :: string`一樣容易地從char *構造一個stringstream。如果您有不同的問題,請提出一個新問題。但不要隨意回答。 – Eclipse 2012-06-19 14:22:15

0

這不僅僅是一點點C-ISH多,但你可以在C字符串表示中使用sscanf()。或者你可以使用strtol()或親屬 - 也可以用C字符串表示。

更多的C++ - ish方式可能會使用字符串流和提取器。

0

我想:

while (!inFile.eof()) { 
    getline (inFile,inputLine); 
    stringstream ss(inputLine); 
    ss >> rows >> columns; 
} 

,我得到了以下錯誤:

「這一術語不計算爲服用1個參數的函數」 在行

SS(inputLine);

編輯:所以你必須在你給它參數的時刻聲明字符串流。上面編輯的正確代碼。

+0

順便說一句:永遠不要在eof()上循環,而是在讀 - > while(std :: getline(....)) – 2008-10-19 08:28:53

5

有幾件事要考慮:
讓我們假設你在每一行上都有兩個數字,然後是你不關心的文本。

while(inFile >> rows >> columns) 
{ 
    // Successfully read rows and columns 

    // Now remove the extra stuff on the line you do not want. 
    inFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
} 

還要注意,如果分離的整數值的唯一的事情是「空白」,那麼你甚至不需要使用忽略()行。

上述while()的工作原理是:操作符>>返回一個流對象(引用)。由於流對象正在布爾上下文中使用,編譯器會嘗試將其轉換爲布爾值,並且該流對象具有一個轉換操作符(通過在流上調用good())進行轉換。

重要的是要注意的是使用線

while(inFile.eof()) 

如果你使用這個,那麼你落入最後一行的問題陷阱。如果你已經讀取了所有的數據,eof()仍然是錯誤的(因爲在你嘗試讀取過去的EOF之前它是不正確的)。所以文件中沒有數據,但你仍然進入循環體。在你的代碼中,getline()然後被執行並失敗(不再有數據),EOF現在被設置。循環的其餘部分將取決於inLine的定義方式和位置。

您可以像上面那樣使用此測試。但是,在使用它之後,您還必須願意測試該流是否正常。

while(inFile.eof()) // Should probably test good() 
{ 
    getLine(inFile,inputline); 
    if(inFile.eof()) // should probably test good() 
    { 
     break; 
    } 
} 
0

千萬不要使用。eof()用於測試您是否可以讀取,也可用於測試之前的讀取是否失敗。因爲這兩種方法都將在某些情況下會失敗:即使有沒有留下任何字符,如果沒有讀取過去的結束已經又試圖

  • EOF沒有設置(如最後一行的函數getline後,如果有最後一個換行符)
  • 即使在成功讀取後,如果讀取操作必須在結束後查看下一個字符以確定它應該停止讀取(例如,在最後一行的geline後,if最後沒有換行字符)

一般而言,您應該只在讀取失敗後使用.eof()來檢查輸入結束導致失敗。使用while (std::getline(...))來循環線路。