我正在使用 c++ 读取文件并通过键名获取键值。关键是这个文件中的键名可能会重复很多次。它们的结构如下。
数据文件格式
请记住,现在我对原始代码没有太多控制权,这就是这个数据文件的格式。
dictName
{
keyA 9;
keyB 3;
keyC 5;
subDictName
{
keyD 0.57;
keyE 5.23;
}
}
anotherDictName
{
keyG 6;
keyC 1;
subDictName
{
keyF 0.17;
keyE 2.21;
}
}
我写了以下代码,但我发现它不够干净,有人知道在 C++ 中处理括号匹配的更好解决方案吗?
我写的代码
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ifstream inf(fileName);
istream_iterator<string> first(inf), last;
vector<string> lines(first, last);
for (unsigned i = 0; i < lines.size(); ++i)
{
if (size_t pos1 = lines[i].find(dictName) != string::npos)
{
size_t len1 = string(dictName).length();
if (!isalnum(lines[i][pos1+len1+1]))
{
unsigned lineSta = 0;
unsigned lineEnd = 0;
for (unsigned j = i+1; j < lines.size(); ++j)
{
if (lines[j].find("{") != string::npos)
{
lineSta = j+1;
break;
}
}
for (unsigned k = lineSta+1; k < lines.size(); ++k)
{
if (lines[k].find("}") != string::npos)
{
lineEnd = k-1;
break;
}
}
for (unsigned l = lineSta; l <= lineEnd; ++l)
{
if (size_t pos2 = lines[l].find(keyName) != string::npos)
{
size_t len2 = string(keyName).length();
if (!isalnum(lines[l][pos2+len2+1]))
{
outputStr = split(lines[l+1], ';')[0];
cout<< "outputStr = " << outputStr << endl;
break;
}
}
}
}
}
}
return 0;
}