C ++如何检查行中的最后一个值并在大于某个值时替换行
C++ How to check last value in line and replace line if it is more than a certain value
我想替换文件的一行,但前提是第 3 个(最后一个)值高于 0.000000
。
具体来说,我有一个 Ascii .stl 文件,如下所示,我希望能够在其中检查每个 vertex
行的最后一个值,如果它在上面,则用不同的字符串替换整行0.000000
。
我真的很难理解如何使用正则表达式创建解析器来寻找它。我也不知道这样是不是最好的方法
非常感谢任何有关解析的帮助。
facet normal -1.000000 0.000000 0.000000
outer loop
vertex 26.000000 6.000000 0.000000
vertex 26.000000 6.000000 1.000000
vertex 26.000000 7.000000 1.000000
endloop
endfacet
facet normal -1.000000 0.000000 0.000000
outer loop
vertex 26.000000 6.000000 0.000000
vertex 26.000000 7.000000 1.000000
vertex 26.000000 7.000000 0.000000
endloop
endfacet
facet normal 0.000000 1.000000 0.000000
outer loop
vertex 26.000000 7.000000 0.000000
vertex 26.000000 7.000000 1.000000
vertex 27.000000 7.000000 1.000000
endloop
endfacet
endsolid
如果重要的话,我在 Microsoft Visual Studio 2019
我同意其他人的意见,即根据您的解决方案的性质,Regex 可能不是最佳方法。但是要让正则表达式找到你想要的东西:
vertex.+\s[0-9\.]*[1-9][0-9\.]*$
应该可以解决问题。
(regex101)
对于检测哪一行以“vertex”开头这样简单的事情,我认为您不需要像正则表达式这样繁重的事情。
这是一个非常简单的检测以“vertex”开头的线的例子:
#include <sstream>
#include <string>
#include <iostream>
std::string test = "facet normal -1.000000 0.000000 0.000000\n"
"outer loop\n"
"vertex 26.000000 6.000000 0.000000\n"
"vertex 26.000000 6.000000 1.000000\n"
"vertex 26.000000 7.000000 1.000000\n"
"endloop\n"
"endfacet\n"
"facet normal -1.000000 0.000000 0.000000\n"
"outer loop\n"
"vertex 26.000000 6.000000 0.000000\n"
"vertex 26.000000 7.000000 1.000000\n"
"vertex 26.000000 7.000000 0.000000\n"
"endloop\n"
"endfacet\n"
"facet normal 0.000000 1.000000 0.000000\n"
"outer loop\n"
"vertex 26.000000 7.000000 0.000000\n"
"vertex 26.000000 7.000000 1.000000\n"
"vertex 27.000000 7.000000 1.000000\n"
"endloop\n"
"endfacet\n"
"endsolid";
int main()
{
std::istringstream strm(test);
std::string line;
int lineNumber = 0;
while (std::getline(strm, line))
{
++lineNumber;
if (line.compare( 0, 6, "vertex", 6) == 0) // check if line starts with "vertex"
{
std::istringstream strm2(line); // read the line
std::string type;
double num1, num2, num3;
strm2 >> type >> num1 >> num2 >> num3;
if ( num3 > 0 ) // checks the last number
std::cout << "Line " << lineNumber << ": " << line << "\n"; // just outputs that line
}
}
}
输出:
Line 4: vertex 26.000000 6.000000 1.000000
Line 5: vertex 26.000000 7.000000 1.000000
Line 11: vertex 26.000000 7.000000 1.000000
Line 18: vertex 26.000000 7.000000 1.000000
Line 19: vertex 27.000000 7.000000 1.000000
代替文件,代码从字符串流中读取数据。
只需要检测以"vertex"
开头的行,然后使用std::istringstream读取数据即可。
我想替换文件的一行,但前提是第 3 个(最后一个)值高于 0.000000
。
具体来说,我有一个 Ascii .stl 文件,如下所示,我希望能够在其中检查每个 vertex
行的最后一个值,如果它在上面,则用不同的字符串替换整行0.000000
。
我真的很难理解如何使用正则表达式创建解析器来寻找它。我也不知道这样是不是最好的方法
非常感谢任何有关解析的帮助。
facet normal -1.000000 0.000000 0.000000
outer loop
vertex 26.000000 6.000000 0.000000
vertex 26.000000 6.000000 1.000000
vertex 26.000000 7.000000 1.000000
endloop
endfacet
facet normal -1.000000 0.000000 0.000000
outer loop
vertex 26.000000 6.000000 0.000000
vertex 26.000000 7.000000 1.000000
vertex 26.000000 7.000000 0.000000
endloop
endfacet
facet normal 0.000000 1.000000 0.000000
outer loop
vertex 26.000000 7.000000 0.000000
vertex 26.000000 7.000000 1.000000
vertex 27.000000 7.000000 1.000000
endloop
endfacet
endsolid
如果重要的话,我在 Microsoft Visual Studio 2019
我同意其他人的意见,即根据您的解决方案的性质,Regex 可能不是最佳方法。但是要让正则表达式找到你想要的东西:
vertex.+\s[0-9\.]*[1-9][0-9\.]*$
应该可以解决问题。 (regex101)
对于检测哪一行以“vertex”开头这样简单的事情,我认为您不需要像正则表达式这样繁重的事情。
这是一个非常简单的检测以“vertex”开头的线的例子:
#include <sstream>
#include <string>
#include <iostream>
std::string test = "facet normal -1.000000 0.000000 0.000000\n"
"outer loop\n"
"vertex 26.000000 6.000000 0.000000\n"
"vertex 26.000000 6.000000 1.000000\n"
"vertex 26.000000 7.000000 1.000000\n"
"endloop\n"
"endfacet\n"
"facet normal -1.000000 0.000000 0.000000\n"
"outer loop\n"
"vertex 26.000000 6.000000 0.000000\n"
"vertex 26.000000 7.000000 1.000000\n"
"vertex 26.000000 7.000000 0.000000\n"
"endloop\n"
"endfacet\n"
"facet normal 0.000000 1.000000 0.000000\n"
"outer loop\n"
"vertex 26.000000 7.000000 0.000000\n"
"vertex 26.000000 7.000000 1.000000\n"
"vertex 27.000000 7.000000 1.000000\n"
"endloop\n"
"endfacet\n"
"endsolid";
int main()
{
std::istringstream strm(test);
std::string line;
int lineNumber = 0;
while (std::getline(strm, line))
{
++lineNumber;
if (line.compare( 0, 6, "vertex", 6) == 0) // check if line starts with "vertex"
{
std::istringstream strm2(line); // read the line
std::string type;
double num1, num2, num3;
strm2 >> type >> num1 >> num2 >> num3;
if ( num3 > 0 ) // checks the last number
std::cout << "Line " << lineNumber << ": " << line << "\n"; // just outputs that line
}
}
}
输出:
Line 4: vertex 26.000000 6.000000 1.000000
Line 5: vertex 26.000000 7.000000 1.000000
Line 11: vertex 26.000000 7.000000 1.000000
Line 18: vertex 26.000000 7.000000 1.000000
Line 19: vertex 27.000000 7.000000 1.000000
代替文件,代码从字符串流中读取数据。
只需要检测以"vertex"
开头的行,然后使用std::istringstream读取数据即可。