Чтение информации из файла с использованием регулярных выражений - PullRequest
0 голосов
/ 17 марта 2019

Я хочу создать класс с именем FileManager, который сохраняет и загружает данные из файла (save.ini)

Ниже я приведу свой формат файла данных:

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

Мне интересно, как я могу создать метод, который читает только правую сторону, после знака =. Вероятно, я должен использовать регулярные выражения там, но все же я не знаю, как я могу загрузить их в массив или вектор. Я пытался использовать getline (), но что-то идет не так; D

Заранее спасибо:)

1 Ответ

0 голосов
/ 17 марта 2019

Вам не нужно регулярное выражение, вы можете легко написать собственный синтаксический анализатор.

Следующий код анализирует одну строку и сохраняет значение в предоставленном 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 и цикл заканчивается.

Конечно, вы можете обернуть это в выбранном вами классе.

...