我正在解析一個輸入文本文件。如果我使用getline()一次獲取輸入的一行,是否有一種方法可以搜索字符串以獲取整數?我正在考慮類似於Java中的getNextInt()。從一行解析整數
我知道在該輸入行中必須有2個數字;然而,這些值將被一個或多個空格字符分隔,所以我不能只是去特定的位置。
我正在解析一個輸入文本文件。如果我使用getline()一次獲取輸入的一行,是否有一種方法可以搜索字符串以獲取整數?我正在考慮類似於Java中的getNextInt()。從一行解析整數
我知道在該輸入行中必須有2個數字;然而,這些值將被一個或多個空格字符分隔,所以我不能只是去特定的位置。
如果在那裏的唯一事情是空白和整數,只要嘗試這樣的事:
int i1, i2;
stringstream ss(lineFromGetLine);
ss >> i1 >> i2;
或更容易:
int i1, i2;
theFileStream >> i1 >> i2;
這不僅僅是一點點C-ISH多,但你可以在C字符串表示中使用sscanf()。或者你可以使用strtol()或親屬 - 也可以用C字符串表示。
更多的C++ - ish方式可能會使用字符串流和提取器。
我想:
while (!inFile.eof()) {
getline (inFile,inputLine);
stringstream ss(inputLine);
ss >> rows >> columns;
}
,我得到了以下錯誤:
「這一術語不計算爲服用1個參數的函數」 在行
SS(inputLine);
編輯:所以你必須在你給它參數的時刻聲明字符串流。上面編輯的正確代碼。
順便說一句:永遠不要在eof()上循環,而是在讀 - > while(std :: getline(....)) – 2008-10-19 08:28:53
有幾件事要考慮:
讓我們假設你在每一行上都有兩個數字,然後是你不關心的文本。
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;
}
}
千萬不要使用。eof()用於測試您是否可以讀取,也可用於測試之前的讀取是否失敗。因爲這兩種方法都將在某些情況下會失敗:即使有沒有留下任何字符,如果沒有讀取過去的結束已經又試圖
一般而言,您應該只在讀取失敗後使用.eof()來檢查輸入結束導致失敗。使用while (std::getline(...))
來循環線路。
如何做它的字符串不char * – Yoda 2012-06-19 12:18:32
@羅伯特:我不知道你的投訴是什麼。你可以像`std :: string`一樣容易地從char *構造一個stringstream。如果您有不同的問題,請提出一個新問題。但不要隨意回答。 – Eclipse 2012-06-19 14:22:15