C Программирование на ARM - Вывод и ввод struct в файл - PullRequest
0 голосов
/ 27 февраля 2011

У меня небольшая проблема со структурой в программе, которую я пишу. Фон; Я разрабатываю код на 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)

1 Ответ

2 голосов
/ 27 февраля 2011

Если вы хотите записать структуру в файл, а затем прочитать ее обратно, вы не должны использовать указатели для ее членов.Вы должны объявить это так:

/* specify sizes according to your needs */
#define MAX_NAME_SIZE 16
#define MAX_FWVERSION_SIZE 16
#define MAX_IP_SIZE 16

struct config_information
{
    char name[MAX_NAME_SIZE];

    //version
    char fwversion[MAX_FWVERSION_SIZE];

    //IP address
    char ip[MAX_IP_SIZE];
};

// write it to a file
fat16_write_file(CONF_FILE,&config, sizeof(config_information));

// read it from a file
fat16_read_file(CONF_FILE,&loadedconfig, sizeof(config_information));
...