gpt4 book ai didi

c++ - 解析一个奇怪的字符串 C++

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:27 25 4
gpt4 key购买 nike

我从一个看起来像这样的 .dat 文件中得到了很多数据点

 + (  0.00000000E+00   0.00000000E+00     //this '(' happens once per block of data
+ 0.99999997E-04 0.00000000E+00
+ 0.19999999E-03 0.00000000E+00
+ ...

我无法控制让吐出这些数据的程序对我的工作更友好。

到目前为止,我得到了 vector 中的每一行,我想解析它们,所以我只有数字可以使用,但由于另一个程序使用 .dat 文件,我仍然想保持 .dat 文件的完整性。 dat 文件。

我正在考虑用空格分隔每个字符串,但空格的大小不同(除非无关紧要)并将它们放在一个 vector 中并仅获取我需要的数据,但数据的第一行有4 个字符串,其余行有 3 个字符串。

任何帮助将不胜感激

编辑:我正在获取原始的 .dat 文件,通过它进行跟踪,任何不符合我的阈值的数据 block 都会被忽略。任何这样做,都会被写入一个新文件。这个新文件的所有内容都必须与原始文件完全相同,当然,我不需要的数据除外。

[JD] 根据评论编辑:

我将如何解析这些行,在不删除行的任何内容的情况下保持所有内容相同,并获取数字以便我可以处理需要保留的内容和不需要的内容?

最佳答案

我会创建一个 ctype facet,将 +( [Edit: and ), based on comment] 分类为空白,然后只读数字。假设您保留数字的标准是它大于 1.0e-4。要将数据复制到新文件,删除较小的数字,您可以这样做:

#include <locale>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <sstream>
#include <numeric>

class my_ctype : public
std::ctype<char>
{
mask my_table[table_size];
public:
my_ctype(size_t refs = 0)
: std::ctype<char>(&my_table[0], false, refs)
{
std::copy_n(classic_table(), table_size, my_table);
my_table['('] = (mask)space;
my_table['+'] = (mask)space;
my_table[')'] = (mask)space;
}
};

int main() {
std::locale x(std::locale::classic(), new my_ctype);
std::cin.imbue(x);

std::remove_copy_if(std::istream_iterator<double>(std::cin),
std::istream_iterator<double>(),
std::ostream_iterator<double>(std::cout, "\n"),
[](double in){return in < 1.0e-4; }); // criterion for removing a number
return 0;
}

我猜想(但不是真的知道)您删除数字的标准可能比简单的比较复杂一点。如果它变得更加复杂,您可能希望使用手动定义的仿函数而不是 lambda 来定义您的标准。其余代码(尤其是读取数据的部分)可能会保持不变。

另请注意,按原样,我只是每行向输出写入一个数字。我不知道你是否需要保持更接近原始格式的东西,所以目前我只是保持简单。

关于c++ - 解析一个奇怪的字符串 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11158207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com