簡體   English   中英

如何通過字段從istringstream讀取和驗證

[英]How to read-and-validate from istringstream by fields

我正在嘗試檢查輸入有效性。 我得到一個文件,其中有兩列,第一列是字符串,第二列是整數。 分隔符是任意數量的空格。 問題是,我無法弄清楚如何正確檢查第二項是否真的是一個int。 考慮以下代碼:

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

通過調用lineStream.good()我可以檢測輸入,例如“abcd g”,但是當我輸入類似“abcd 12a”的內容時,它被解析為“abcd”和12.與“abcd 12.2”相同等。

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

謝謝你的提示

在提取int之后,您可以簡單地檢查是否到達了std::stringstream行的末尾。 如果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
  }
}

基本上,有兩個檢查:

  1. 如果無法提取stringintline_stream >> name >> num將失敗。
  2. 在這些提取之后,如果它們到達流的末尾,則將設置eof位。 因此,如果流中仍有內容,則line_stream.eof()將失敗。

顯然,這是一個非常脆弱的方法,只適用於特定情況,並且需要適應線條格式的任何變化。

您可以讀取兩個字符串,然后檢查第二個字符串是否真的是一個數字。 像這樣的東西:

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM