c++ - 如何按字段从 istringstream 读取和验证

标签 c++ parsing istream

我正在尝试检查输入的有效性。我得到一个文件,其中有两列,第一列是字符串,第二列是整数。分隔符是任意数量的空格。问题是,我无法弄清楚如何正确检查第二项是否真的是一个整数。考虑这段代码:

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. line_stream >> name >> num 如果无法提取 stringint 将失败。
  2. 在这些提取之后,如果它们到达流的末尾,eof 位将被设置。因此,如果流中仍有内容,line_stream.eof() 将失败。

显然,这是一种非常脆弱的方法,仅适用于特定情况,并且需要适应行格式的几乎所有变化。

关于c++ - 如何按字段从 istringstream 读取和验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15344842/

相关文章:

xml - 在 Android 中使用 Sax 解析本地 XML 文件

C++ 流混淆 : istreambuf_iterator vs istream_iterator?

c++ - 如何以相反的顺序读取 C++ 程序的输入?

c++ - 为什么 istream 对象可以用作 bool 表达式?

C++:从管道填充 vector

c++ - Charniak 解析器错误

C++ 库,静态和动态

c++ - 将字符串的每个单词插入 vector 并计算每个单词的出现

parsing - yacc - 没有运算符的规则的优先级?

asp.net - 从任意 URL 获取值