我真的需要您的帮助进行编码:
我有一个file2
文本文件,其中包含如下所示的数字范围:
12345678[5-8][0-9]
3684567150
329465207[023456789]
132478026[13]
778941351[02-689]
84364575[89][0-9]
88229401XX
981024833X
8912380XXX
所以这个数字范围像这样分解:
12345678[5-8][0-9]: 1234567850-1234567889
3684567150: 3684567150
329465207[023456789]: 3294652070 and 3294652072-3294652079
132478026[13]: 1324780261 and 1324780263
778941351[02-689]: 7789413510, 7789413512-7789413516, 7789413518 and 7789413519
84364575[89][0-9]: 8436457580-8436457599
88229401XX: 8822940100-8822940199
981024833X: 9810248330-9810248339
8912380XXX: 8912380000-8912380999
X
可以从0 to 9
取值。所有这些数字都是10位数字。但是范围有时可能会有很大差异,可以写为:[02-9]
的范围写为:[023456789]
,反之亦然。
我只需要这部分内容来了解如何将其读为数字范围或定义类似的情况:
XXXXXXXXX[X-X]
XXXXXXXX[X-X][X-X]
XXXXXXXXX[XX-X]
XXXXXXXXX[XXXXXXXX]
等 但是对如何执行此操作没有任何想法,希望您能为我提供帮助。现在,我只是将文件中的数据保存到字符串向量中:
ifstream file2("file2.txt");
while (getline(file2,line) && line.size()>=0)
vfile2.push_back(line);
请不要孤单,我什至不知道该如何开始,我为此做了更多的代码,但这与这部分无关,因为这不仅是整个程序应该执行的任务,您需要证据让我知道。
谢谢!
已更新:
我有一个file2
文本文件,其中包含如下所示的数字范围:
88229401XX
981024833X
8912380XXX
所以这个数字范围像这样分解:
88229401XX: 8822940100-8822940199
981024833X: 9810248330-9810248339
8912380XXX: 8912380000-8912380999
再次感谢您的帮助和时间,如果能解决此问题(我可能对此有一些想法),我会并行处理。
答案 0 :(得分:0)
这是一个解析问题。有一些工具可以帮助您进行解析,但是必须学习它们。有时候,最好只是潜入并编写代码。如果您有条不紊,这并不难。诀窍是使代码的结构与您要解析的语法的结构相匹配。
以下代码假定您要将整数存储在向量中。它只是在最后打印出该向量的内容。
以下代码完全不对输入进行错误检查。在实际程序中,这将是一个严重的问题。我让您添加错误检查。
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdint>
typedef uint64_t int_type;
void parse(const std::string& line, std::vector<int_type>& numbers)
{
numbers = { 0 };
size_t i = 0;
while (i < line.size())
{
char ch = line[i++];
if (ch == '[')
{
// start a group
std::string group;
while (line[i] != ']')
{
char lo = line[i++];
if (line[i] == '-')
{
++i;
char hi = line[i++];
while (lo <= hi)
{
group += lo;
++lo;
}
}
else
{
group += lo;
}
}
++i;
// add the new numbers implied by the group
std::vector<int_type> new_numbers;
for (auto num : numbers)
{
for (auto digit : group)
new_numbers.push_back(10 * num + (digit - '0'));
}
numbers.swap(new_numbers);
}
else
{
std::transform(numbers.begin(), numbers.end(), numbers.begin(),
[=](auto n) { return 10 * n + (ch - '0'); });
}
}
}
int main()
{
std::string data = "12345678[5-8][0-9]\n"
"3684567150\n"
"329465207[023456789]\n"
"132478026[13]\n"
"778941351[02-689]\n"
"84364575[89][0-9]\n";
std::istringstream input(data);
std::string line;
while (getline(input, line) && line.size() >= 0)
{
std::vector<int_type> numbers;
parse(line, numbers);
for (auto num : numbers)
{
std::cout << num << '\n';
}
std::cout << '\n';
}
}
仅经过简短测试,但似乎可以正常工作。