使用正则表达式从文件中读取数据信息

时间:2019-03-17 17:37:04

标签: c++ file objective-c++

我想创建一个名为FileManager的类,该类用于保存和加载文件(save.ini)中的数据

下面,我将数据文件格式设置为

property=value;
property2=value2;
property3=value3;

我想知道如何创建在=号后仅读取右侧的方法。可能我必须在那里使用正则表达式,但仍然不知道如何将它们加载到数组或向量中。我尝试使用getline(),但是出了点问题; D

预先感谢:)

1 个答案:

答案 0 :(得分:0)

您不需要正则表达式,可以轻松编写自己的解析器。

以下代码解析一行并将值保存在提供的unordered_map中:

void parseLine(char * line, std::unordered_map<std::string, std::string> & values)
{
    // Find entry name
    const char * name = line;
    for (char c = *line; c != '='; c = *(++line));
    *line = '\0';

    // Find entry value
    const char * val = line + 1;
    for (char c = *line; c != ';'; c = *(++line));
    *line = '\0';

    // Insert value in map
    values.insert(std::pair<std::string, std::string>(name, val));
}

它只是扫描行,直到找到'='';'。请注意,这仅在语法正确的情况下有效(无空格,分号结尾),但我认为这就是您想要的。

然后解析文件:

std::unordered_map<std::string, std::string> values;
FILE * fp = fopen("somefile", "r");
if (fp)
{
    char line[128]; // replace with max line length
    while (fgets(line, 128, fp))
        parseLine(line, values);
}

fclose(fp);

fgets(line, 128, fp)最多读取文件128当前行的fp个字符,并将其保存在缓冲区line中。当到达EOF时,它返回nullptr,循环结束。

当然,您可以将其包装在您选择的类中。