У меня небольшая проблема со структурой в программе, которую я пишу.
Фон; Я разрабатываю код на C на чипе ARMv7. Система имеет SD-карту с файловой системой FAT16 для доступа к файлам.
Я использую библиотеку для операций чтения и записи файлов FAT16, чтобы выполнить любую работу с файлами ввода / вывода.
В настоящее время я объявляю структуру глобально перед основной функцией;
struct config_information
{
char *name;
//version
char *fwversion;
//IP address
char *ip;
};
//Declare structs for config information
struct config_information config;
struct config_information loadedconfig;
Указатели предназначены для строкового использования.
Я прочитал данные в эти переменные, используя & config.name например. Я должен использовать функцию, которую я написал, чтобы прочитать символы, полученные через последовательный порт, в другой указатель на символ, чтобы strcat на другой, но это работает правильно, и я проверил, что вводимые пользователем данные совпадают с записанным вводом (быстро экран подсказки в окне терминала, чтобы узнать подробности, если кому-то интересно).
Затем я реализую предоставленную библиотечную функцию для сохранения структуры в файл;
fat16_write_file(CONF_FILE,&config, READBUFSIZE);
Где CONF_FILE - просто дескриптор файла для используемого файла, & config - выходной буфер, а READBUFSIZE - размер буфера (определяется как 148, достаточно большой для моих целей, но позже я надеюсь изменить его для вычисления размера структуры для вывода, а затем рассчитать размер файла, чтобы можно было правильно прочитать его обратно). Я добавил определение функции, предоставленное библиотекой, с оператором открытия в конце для справки на случай, если мне неясно.
Это работает отлично, вывод в файл;
Name1.1 192.168.1.1
с большим количеством пробелов. Очевидно, что я ввожу Name в качестве Name, 1.1 в качестве прошивки, а IP говорит само за себя.
Наивно я думал, что смогу сделать обратное, чтобы прочитать его обратно в структуру loadconfig, которую я объявил с этим;
fat16_read_file(CONF_FILE,&loadedconfig,READBUFSIZE);
Понятно, что у этого нет надежды на работу, так как структура не имеет предопределенных размеров, чтобы знать, сколько нужно читать обратно.
Итак, как я могу прочитать данные, которые я сохранил, обратно в ту же структуру, из которой они получены?
Имя может быть любого размера, не массивным, но его нельзя предсказать. Версия FW будет всегда только #. #, А IP явно находится в уже определенных пределах.
Спасибо за любые подсказки или толчки в правильном направлении. Пожалуйста, спросите, считаете ли вы, что вам нужна дополнительная информация, чтобы понять сферу.
Для справки;
/**
* \ingroup fat16_file
* Reads data from a file.
*
* The data requested is read from the current file location.
*
* \param[in] fd The file handle of the file from which to read.
* \param[out] buffer The buffer into which to write.
* \param[in] buffer_len The amount of data to read.
* \returns The number of bytes read, 0 on end of file, or -1 on failure.
* \see fat16_write_file
*/
int16_t fat16_read_file(struct fat16_file_struct* fd, uint8_t* buffer, uint16_t buffer_len)
/**
* \ingroup fat16_file
* Writes data to a file.
*
* The data is written to the current file location.
*
* \param[in] fd The file handle of the file to which to write.
* \param[in] buffer The buffer from which to read the data to be written.
* \param[in] buffer_len The amount of data to write.
* \returns The number of bytes written, 0 on disk full, or -1 on failure.
* \see fat16_read_file
*/
int16_t fat16_write_file(struct fat16_file_struct* fd, const uint8_t* buffer, uint16_t buffer_len)