[英]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
}
}
基本上,有兩個檢查:
string
或int
則line_stream >> name >> num
將失敗。 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.