Я была поставлена задача обновить функцию, которая в настоящее время читает в файле конфигурации с диска и заполняющий структуру:функция Convert для чтения из строки вместо файла в C
static int LoadFromFile(FILE *Stream, ConfigStructure *cs)
{
int tempInt;
...
if (fscanf(Stream, "Version: %d\n",&tempInt) != 1)
{
printf("Unable to read version number\n");
return 0;
}
cs->Version = tempInt;
...
}
к одному, что позволяет нам перепускной запись конфигурации на диск и вместо того, чтобы передать его непосредственно в памяти, примерно эквивалентно следующему:
static int LoadFromString(char *Stream, ConfigStructure *cs)
несколько вещей, чтобы отметить:
- Текущая функция LoadFromFile невероятно плотная и сложная, считывая десятки версий конфигурационного файла с обратной совместимостью, что делает дублирование общей логики довольно болезненной.
- Функции, генерирующие конфигурационный файл, и те, которые его читают, происходят из совершенно разных частей старой системы и поэтому не разделяют никаких структур данных, поэтому я не могу передать их напрямую. Я мог бы написать обертку, но опять же, ей нужно было бы обработать любую структуру, переданную обратно совместимым образом.
- У меня возникает желание просто передать файл как есть в виде строки (как в прототипе выше) и преобразовать все fscanf в sscanf, но тогда мне придется обрабатывать увеличение указателя (и, возможно, иметь дело с ошибками переполнения буфера) вручную.
- Это должно оставаться в C, поэтому не C++ функциональность как потоки не могут помочь здесь
Я пропускаю лучший вариант? Есть ли способ создать FILE *, который на самом деле просто указывает на местоположение в памяти, а не на диске? Любые указатели, предложения или другая помощь приветствуются.
Рассматривали ли вы использование разделяемой памяти или файла с отображением памяти? – jschmier
Я не могу сказать, что у меня есть, хотя я не очень хорошо знаком с ними. Что-то вроде mmap() хорошее место для начала? – Dusty