Вы можете разбить линию в формате, указанном с помощью std::stringstream
. Вот пример:
std::string line; // A line of key/values from text
std::string key; // Temporary for our key
std::string value; // Temporary for our value
std::ifstream stream(path); // Load the file stream
std::stringstream splitter; // Prepare a stringstream as a splitter (splits on spaces) for reading key/values from a line
// Make sure we can read the stream
if (stream) {
// As long as there are lines of data, we read the file
while (std::getline(stream, line)) {
splitter << line; // Load line into splitter
splitter >> key; // Read the key back into temporary
splitter >> value; // Read the value back into temporary
splitter.clear(); // Clear for next line
variables[key] = value; // Store the key/value pair in our variable map.
}
}
else {
// The file was not found or locked, etc...
std::cout << "Unable to open file: " << path << std::endl;
}
Не забудьте включить <string>
и <sstream>
. Я думаю, вам также понадобится <iostream>
для getline()
.
ПРИМЕЧАНИЕ: У меня есть полный рабочий пример этого, который я могу опубликовать, но я решил, что оставлю вам полное упражнение. Если вам нужно больше, дайте мне знать, но я считаю, что лучше всего изучить, исследуя решение, вместо того, чтобы оно было передано вам. Удачи вам на роботе!
ВАЖНО: Мне просто пришло в голову, что мое решение не касается префикса white-space или '#', который вы выражаете. Я бы рекомендовал либо изменить требования, либо вам придется использовать это как промежуточную точку для решения немного более сложного разбора. Например, вы можете проверить, свободен ли ключ, и если да, то переменная имела префикс пробела. Затем вы повторно загрузите ключ и добавьте перед ним пробел, чтобы получить свое окончательное имя переменной. Аналогично, вы можете проверить первый символ ключа для «#». Это немного больше работы, но должно быть выполнимо, изменив мой пример кода.
Для поиска используйте «Переполнение стека» для «чтения файла C++». До сих пор существует слишком много вариаций. –
Также есть много библиотек для такого рода вещей (например, [libini] (http://sourceforge.net/projects/libini/)) - лучше использовать один из них, чем изобретать колесо. –
Большинство примеров используют 'std :: getline', а также' std :: string' для строки (типы текста). Вы ограничены использованием 'fgets'? –