2013-03-11 23 views
3

我試圖檢查輸入有效性。給我一個文件,其中有兩列,第一個是字符串,第二個是ints。分隔符是任意數量的空格。問題是,我無法弄清楚如何正確檢查第二個項目是否是int。通過調用lineStream.good()我可以檢測輸入如「ABCD G」,但是當我在放像「ABCD 12A」,它被解析爲「ABCD」和12同樣的,「如何從字符串中讀取和驗證istringstream

string line; // parameter with a string to be parsed 
string name; 
int num; 
istringstream lineStream(line); 
lineStream >> name; 
lineStream >> num; 

:考慮下面的代碼abcd 12.2「等

在Java中,我可以使用String.split()來數組,然後解析每個整個元素,而不是忽略任何字符,但我不知道什麼是正確的方法。

感謝提示

+0

可以影響C++假設你的分裂相同的「分裂」的策略是基於空格轉換爲字符串,然後再驗證個別實體,但最終的問題是一個亮點。看來你問的是如何驗證被提取的*元素,事實上,它是完整和簡潔的,也許如何通過流屬性收集這些信息。好問題。我會對不同的方法感興趣。 – WhozCraig 2013-03-11 17:42:09

+0

我想知道是否有一種方法可以簡單地做到這一點,即使用流。人們可能會爲創建一個char *數組而煩惱,然後對它們進行標記並檢查有效性,這是真的。 – 2013-03-11 17:46:31

回答

1

你可以簡單地檢查是否達到行std::stringstream結束你提取int後。如果int提取失敗,則根本沒有整數。如果成功了,但流中仍然有內容,那麼這條線就太多了。我想解決這個問題,像這樣:

std::string line, name; 
int num; 
while (std::getline(file, line)) { 
    std::stringstream line_stream(line); 
    if (line_stream >> name >> num && 
     line_stream.eof()) { 
    // Line was of the correct format 
    } 
} 

基本上有兩項檢查:如果它不能提取無論是stringint

  1. line_stream >> name >> num將失敗。
  2. 這些提取後,eof位將設置,如果他們到達流的末尾。因此,如果流中仍有內容,line_stream.eof()將會失敗。

很明顯,這是一個非常脆弱的方法,只適用於特定的情況,並且需要適應幾乎任何行格式的改變。

+0

@JerryCoffin這是一個[常見的誤解](http://stackoverflow.com/q/14615671/150634)(幾乎和思考'!eof()'是一個很好的while條件一樣常見)。提取到達結束時會設置「eof」 - 在閱讀之前使用它不是一個好條件。 – 2013-03-11 17:48:00

+0

如果第二個字段後面有空格,這將不起作用,是嗎? – 2013-03-11 17:48:04

+0

@MartinMelka確實不會。它只會特別允許''。你想在最後允許空格嗎? – 2013-03-11 17:48:27

0

您可以讀取兩個字符串,然後檢查第二個字符串是否是一個數字。事情是這樣的:

std::string line; // parameter with a string to be parsed 
std::string name; 
std::string strNum; 
int num; 
std::istringstream lineStream(line); 
lineStream >> name; 
lineStream >> strNum; 

if (isNumber(strNum)) 
{ 
    num = atoi(strNum.c_str()); 
} 

// 

bool isNumber(const std::string& strNum) 
{ 
    bool lIsNumber = true; 
    std::string::const_iterator it = strNum.begin(); 
    while (it != strNum.end()) 
    { 
     if (!std::isdigit(*it)) 
     { 
     lIsNumber = false; 
     break; 
     } 
     ++it; 
    } 
    return lIsNumber; 
} 
+0

我想這應該工作。它不會考慮其餘部分,但可以輕鬆完成。爲什麼我沒有想到這一點? :o – 2013-03-11 17:55:44