Проблема с fwrite и fread в последовательности - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь написать простую структуру с массивом в файл, а затем прочитать его.Он работает с массивом небольшого размера <25, но по какой-то причине все данные после этого не инициализируются; </p>

typedef struct TestStruct {
    int data[30];
} TestStruct;



TestStruct *test = malloc(sizeof(TestStruct));
for (int i = 0; i < 30; i++)
{
    test->data[i] = i;
}
const char *filename = "some.txt";
FILE *file = fopen(filename, "w+");
fwrite(test, sizeof(TestStruct), 1, file);
rewind(file);
TestStruct *test2 = malloc(sizeof(TestStruct));
int rc = fread(test2, sizeof(TestStruct), 1, file);

Результат этого кода равен rc = 0, а целые числа после индекса 25 не инициализируются длянекоторая причина.Кто-нибудь может объяснить, в чем проблема?

1 Ответ

0 голосов
/ 04 января 2019
  • Вы работаете на платформе Windows или DOS.
  • Вы используете двоичные данные.
  • Вы записываете control-Z в файл (байт-код 26 по индексу26).
  • Поскольку вы не указали b (для двоичного файла) в строке режима, используемой с fopen(), control-Z обрабатывается как маркер EOF при чтении данных.

Исправление: Используйте "w+b" вместо просто "w+" для решения проблемы.

Обратите внимание, что возвращаемое значение rc = 0 из fread() означаетчто при чтении не удалось прочитать всю запрошенную структуру (потому что только 26 байтов, значения 0..25, были прочитаны до обнаружения EOF).Он сделал все возможное, чтобы вы знали, что возникла проблема.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...