c++ - 如何在C++中将字母分配给数据中的特定数字

标签 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();

最佳答案

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

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

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

#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

关于c++ - 如何在C++中将字母分配给数据中的特定数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46740429/

相关文章:

c++ - 为什么我用 "randomSelect"方法替换几行代码后程序无法运行

c++ - 为什么如果我注释了 "while" block ,程序就会死锁?其中的 "yield"行有何作用?

c++ - 当仅需要 X-Y 旋转时,3D 对象沿所有三个轴旋转

c++ - 类定义中的模板特化

c++ std::sort() 任何可比较成员仅使用一个比较函数的对象 vector

c++ - 类型别名和自引用

c++ - 无法将 C++ 字符串 vector 转换为 V8 数组

c++ - 快速单精度矩阵乘 vector 积

c++ - 为什么函数参数名称在 C++ 声明中不重要?

c++ - 打印最长公共(public)子序列