如何在c ++中为数据中的特定数字指定一个字母

时间:2017-10-14 03:01:36

标签: c++

我刚接触c ++&编码ROOT(CERN)。我在下面有这些数据,即以回车为限。我想只得到一个数字1001.612999并将其分配给变量'z'。

# Space_ValveOpen_mca1.CNF [CR]
#Real Live [CR] 1001.612999 999.999999[CR]
0      0
1      0

我使用下面的代码却什么也没得到。请有人可以帮助我吗?

ifstream myfile;
myfile.open("Space_ValveClosed_mca1.dat");
int z;
myfile >> z;
cout << z << endl;  

myfile.close();

1 个答案:

答案 0 :(得分:0)

我从不建议通过原始运算符>>读取用户输入。关于您与std::regex的斗争,我决定给您一个代码段。不过,不要问正则表达式是什么。

PS:我已经意识到[CR]是一个回车符号。这可能会将正则表达式简化为(\d+(?:\.\d*)?)\s(\d+(?:\.\d*)?),但您必须将其应用于第三行。

PPS:如果您尝试像使用R等语言一样尝试阅读源数据,那么您的问题看起来就不像我原先想象的那么愚蠢。 C ++是一种通用语言,因此缺少用于读取某些格式(如CSV)的文件的内置例程。输入流的运算符>>不是表读取例程。它不能推断以#开头的行是注释。更糟糕的是,它打破了输入流,因为它无法将#解析为整数,也无法报告错误(当C ++不成熟时,C ++ iostream库已被编写,因此它具有相当奇怪的界面)。因此,它在输入流上设置错误标志,否则不执行任何操作。

#include <iostream>
#include <regex>

int main()
{
  std::string source = "#Real Live [CR] 1001.612999 999.999999";
  std::regex extractNumbers(R"(#Real\sLive\s\[CR\]\s(\d+(?:\.\d*)?)\s(\d+(?:\.\d*)?))");
  std::smatch matches;
  double num1, num2;

  if (std::regex_search(source, matches, extractNumbers)) {
    {
      std::istringstream is(matches[1].str());
      is >> num1;
    }
    {
      std::istringstream is(matches[2].str());
      is >> num2;
    }
  } else {
    std::cout << "Match not found\n";
  }
  std::cout << num1 << ' ' << num2 << '\n';
  return 0;
}

You can check this code online