我刚接触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();
答案 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;
}