gpt4 book ai didi

c++ - 帮助改进这个INI解析代码

转载 作者:行者123 更新时间:2023-11-30 01:33:04 25 4
gpt4 key购买 nike

这是我为 this question 想出的简单方法.我对此并不完全满意,我认为这是一个帮助我改进对 STL 和基于流的编程的使用的机会。

std::wifstream file(L"\\Windows\\myini.ini");
if (file)
{
bool section=false;
while (!file.eof())
{
std::wstring line;
std::getline(file, line);
if (line.empty()) continue;

switch (line[0])
{
// new header
case L'[':
{
std::wstring header;
size_t pos=line.find(L']');
if (pos!=std::wstring::npos)
{
header=line.substr(1, pos);
if (header==L"Section")
section=true;
else
section=false;
}
}
break;
// comments
case ';':
case ' ':
case '#':
break;
// var=value
default:
{
if (!section) continue;

// what if the name = value does not have white space?
// what if the value is enclosed in quotes?
std::wstring name, dummy, value;
lineStm >> name >> dummy;
ws(lineStm);
WCHAR _value[256];
lineStm.getline(_value, ELEMENTS(_value));
value=_value;
}
}
}
}

你会如何改进它?请不要推荐替代库 - 我只是想要一个简单的方法来从 INI 文件中解析出一些配置字符串。

最佳答案

// what if the name = value does not have white space?
// what if the value is enclosed in quotes?

我会使用 boost::regex 来匹配每种不同类型的元素,例如:

boost::smatch matches;
boost::regex name_value("(\S+)\s*=\s*(\S+)");
if(boost::regex_match(line, matches, name_value))
{
name = matches[1];
value = matches[2];
}

正则表达式可能需要一些调整。

我还会用 std::getline 替换 de stream.getline,摆脱静态字符数组。

关于c++ - 帮助改进这个INI解析代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/146943/

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