Как записать структуру в файл, используя fwrite? - PullRequest
3 голосов
/ 11 ноября 2010

Я очень плохо знаком с C, и у меня проблемы с fwrite.

Я ищу использовать структуру, которая содержит два значения:

struct keyEncode{
    unsigned short key[2];
    unsigned short encoded[2];
};

Затем я объявляюмоя структура и указатель на эту структуру в моем основном:

struct keyEncode keynEncode;
struct keyEncode *storedVal = &keynEncode;

Затем я присваиваю значения структуре и хочу записать структуру в файл, используя fwrite:

keynEncode.key[0] = k1[0];
keynEncode.key[1] = k1[1];
keynEncode.encoded[0] = p[0];
keynEncode.encoded[1] = p[1];
// i tried to use storedVal.key[0] = k1[0]; but i was getting compile errors

fwrite(storedVal, sizeof(storedVal), 0xffff, fp);

Теперьмоя проблема в том, что fwrite ничего не записывает в файл.

Где я ошибаюсь?

Ответы [ 6 ]

15 голосов
/ 11 ноября 2010

Вы используете sizeof для указателя, это не будет вычислять размер эффективной структуры, а размер указателя (это может быть 4 или 8 байтов).Попробуйте с sizeof(struct keyEncode) (sizeof(keyEncode) достаточно, если вы используете C ++).

Тогда я не понимаю, почему у вас 0xFFFF в качестве счетчика, разве это не должно быть просто 1?

4 голосов
/ 11 ноября 2010

Если у вас есть только одна такая структура, вам нужно изменить:

fwrite(storedVal, sizeof(storedVal), 0xffff, fp);

до

fwrite(storedVal, sizeof(*storedVal), 1, fp);

1 голос
/ 11 ноября 2010

Аргументами для fwrite() являются данные для печати, размер одного элемента данных, количество элементов данных и указатель файла.

У вас есть две проблемы с размерами:

  1. Вы указываете 'sizeof(storedVal)', который является размером указателя, а не размером структуры.
  2. Вы указываете, что 65 535 из них должны быть записаны.

Итак, вам нужно использовать:

 if (fwrite(storedVal, sizeof(*storedVal), 1, fp) != 1)
    ...error handling...

Обратите внимание, что fwrite() возвращает количество записанных элементов.В общем случае у вас есть n элементов для записи, и вы должны проверить:

 if (fwrite(storedVal, sizeof(*storedVal), n, fp) != n)
    ...error handling...
0 голосов
/ 11 ноября 2010

Посмотрите на определения ваших переменных и посмотрите, какое из них вы используете в вызове sizeof. Правильно ли указывать размер указателя, а не размер данных? Также проверьте использование fwrite, я думаю, что вы неправильно указали параметр "count". Определяется как

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

Параметр count указывает число блоков размером размер для записи в файл.

Я действительно не хочу давать вам ответ сразу (кто-то другой, вероятно, будет), так как это помечено как домашнее задание - вы должны учиться:)

0 голосов
/ 11 ноября 2010
 // i tried to use storedVal.key[0] = k1[0]; but i was getting compile errors

Для этого.Хранилище - это указатель на структуру.Оператор разыменования указателя C -> так что вы хотите

 storedVal->key[0] = k[0];
0 голосов
/ 11 ноября 2010
FILE *fp = fopen("c:\\test", "wb");
if (fp != NULL) {
    fwrite(storedVal, sizeof(keynEncode), 1, fp);
    fclose(fp);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...