【问题标题】:how to assign a letter to a specific number in a data in c++如何将字母分配给c ++中数据中的特定数字
【发布时间】:2017-10-14 03:01:36
【问题描述】:

我是 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::getline 阅读两行并将 std::regex "Real\sLive\s[CR]\s(\d+\.\d+)" 应用于第二行以提取目标细绳。之后您应该将字符串转换为双精度数字。
  • 在使用正则表达式提取包含数字的子字符串后,只需添加您可以使用std::stod 将数字转换为双精度数。
  • @Minor Threat 感谢您的快速响应。我是 C++ 新手,我几乎无法理解如何将 std::regex "Real\sLive\s[CR]\s(\d+\.\d+)" 合并到我的代码中。此外,您能否告诉我如何在使用 std::regex 后将字符串转换为双精度数

标签: c++


【解决方案1】:

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

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

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

#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

【讨论】:

  • 非常感谢您的好意。我运行了代码,但看看我得到了什么
  • 非常感谢你的好意。看看我得到了什么:regex extractNumbers(R"(#Real\sLive\s[CR]\s(\... 为了解决这个问题,我升级了 boost,gtk+,gtk3+ 和 gcc。但是我仍然无法解决它。请帮助我出
  • 你试过谷歌std::regex吗?它可能会显示此页面en.cppreference.com/w/cpp/regex。在此页面上,您可以发现 std::regex 位于 #include
  • 是的,我访问了添加#include 的站点,但得到了相同的结果。我尝试了 #include 和 #include 但它不起作用。
  • 如果我想对另一个具有相同长度的数据重复相同的过程,我会得到错误的数字。我尝试使用stackoverflow.com/questions/5207550/… 中的想法,但我得到了错误的答案。是否有编写“std::string source”的惯例适用于任何具有相同长度的数据?非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2014-02-04
  • 1970-01-01
  • 2022-01-04
  • 2013-10-17
相关资源
最近更新 更多