Чтение бинарного файла на втором проходе цикла завершается с ошибкой - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый день,подскажите как решить проблемку. Читаю бинарный файл в который через некоторое время добавляются новые данные весом 20 КБ.И вот тут возникают проблемы,т.к есть ограничение в размере массива 32 КБ. Для этого сделал смещение в файле т.е читаю первый блок данных,затем второй и т.д. Первый раз все проходит, а во второй раз вылазит ошибка "within the action, an attempt was made during execution to access an undefined memory area". Думал ,что это из-за того что не обнуляется массив Buffer,но обнуление оного погоду не изменило. Посоветуйте решение.
Листинг программы
  1. char Buffer [21000];
  2. int removal,lsize,num,d;
  3.  
  4. FILE *stream;
  5. stream = fopen("С:\\file.bin", "rb");
  6. fseek(stream,0,SEEK_END);
  7. lsize = ftell(stream);
  8. rewind(stream);
  9. removal = 20015; // смещение для каждого блока
  10. Size_data = 20015;//размер одного блока данных
  11. num = lsize / Size_data;//количество блоков данных в файле
  12. for (i=0;i<num;i++)
  13. {
  14. fseek(stream,removal*i,SEEK_SET);
  15. memset(Buffer,0,sizeof(Buffer))
  16. d = fread(Buffer,sizeof(char),Size_data,stream);
  17. fclose(stream);
  18. }

Решение задачи: «Чтение бинарного файла на втором проходе цикла завершается с ошибкой»

textual
Листинг программы
  1. char Buffer [21000];
  2. int removal,lsize,num,d;
  3. int num_read; //кол-во уже прочитанных
  4.  
  5.  
  6.  
  7. FILE *stream;
  8. do
  9. {
  10.  stream = fopen("С:\\file.bin", "rb");
  11.  fseek(stream,0,SEEK_END);
  12.  lsize = ftell(stream);
  13.  rewind(stream);
  14.  
  15.  removal = 20015; // смещение для каждого блока
  16.  Size_data = 20015;//размер одного блока данных
  17.  num = lsize / Size_data;//количество блоков данных в файле
  18.  
  19.    if (num_read<num)
  20.    {
  21.      
  22.       fseek(stream,removal*num_read,SEEK_SET);
  23.       d = fread(Buffer,sizeof(char),Size_data,stream);
  24.       fclose(stream);
  25.       num_read++;
  26.    }
  27.       else
  28.       {fclose(stream);}
  29.  }while (num_read < num);

Объяснение кода листинга программы

  1. Объявлены необходимые переменные:
    • char Buffer[21000];
    • int removal, lsize, num, d;
    • int num_read = 0;
    • FILE *stream;
  2. Задается начальное значение num_read равное 0.
  3. Запускается цикл do-while, который будет выполняться до тех пор, пока num_read меньше num.
  4. Внутри цикла открывается файл С:\\file.bin в бинарном режиме чтения (rb).
  5. Перемещается указатель чтения в конец файла с помощью функций fseek и ftell.
  6. Вычисляется размер одного блока данных (Size_data) и количество блоков данных в файле (num).
  7. Если num_read меньше num, то происходит чтение данных из файла в массив Buffer с помощью функции fread.
  8. Если num_read равно num, то файл закрывается функцией fclose.
  9. Если чтение данных прошло успешно (d не равно 0), то увеличивается значение num_read на единицу.
  10. Если во время чтения возникла ошибка (d равно 0), то файл закрывается функцией fclose.
  11. В конце цикла do-while выполняется инструкция else, которая закрывает файл stream.
  12. Цикл do-while повторяется до тех пор, пока все данные из файла не будут прочитаны.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы