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

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

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

Добрый день,подскажите как решить проблемку. Читаю бинарный файл в который через некоторое время добавляются новые данные весом 20 КБ.И вот тут возникают проблемы,т.к есть ограничение в размере массива 32 КБ. Для этого сделал смещение в файле т.е читаю первый блок данных,затем второй и т.д. Первый раз все проходит, а во второй раз вылазит ошибка "within the action, an attempt was made during execution to access an undefined memory area". Думал ,что это из-за того что не обнуляется массив Buffer,но обнуление оного погоду не изменило. Посоветуйте решение.
char Buffer [21000];
int removal,lsize,num,d;

FILE *stream;
stream = fopen("С:\\file.bin", "rb");
fseek(stream,0,SEEK_END);
lsize = ftell(stream);
rewind(stream);
 
removal = 20015; // смещение для каждого блока
Size_data = 20015;//размер одного блока данных
num = lsize / Size_data;//количество блоков данных в файле
 
for (i=0;i<num;i++)
   {
      fseek(stream,removal*i,SEEK_SET);
      memset(Buffer,0,sizeof(Buffer))
      d = fread(Buffer,sizeof(char),Size_data,stream);
      fclose(stream);
    }

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

textual
Листинг программы
char Buffer [21000];
int removal,lsize,num,d;
int num_read; //кол-во уже прочитанных
 
 
 
FILE *stream;
do
{
 stream = fopen("С:\\file.bin", "rb");
 fseek(stream,0,SEEK_END);
 lsize = ftell(stream);
 rewind(stream);
 
 removal = 20015; // смещение для каждого блока
 Size_data = 20015;//размер одного блока данных
 num = lsize / Size_data;//количество блоков данных в файле
 
   if (num_read<num)
   {
      
      fseek(stream,removal*num_read,SEEK_SET);
      d = fread(Buffer,sizeof(char),Size_data,stream);
      fclose(stream);
      num_read++;
   }
      else 
      {fclose(stream);}
 }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
Похожие ответы