我刚开始使用 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;
}
关于c++ - 如何在C++中将字母分配给数据中的特定数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46740429/