Чтение бинарного файла на втором проходе цикла завершается с ошибкой - 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);
Объяснение кода листинга программы
- Объявлены необходимые переменные:
- char Buffer[21000];
- int removal, lsize, num, d;
- int num_read = 0;
- FILE *stream;
- Задается начальное значение num_read равное 0.
- Запускается цикл do-while, который будет выполняться до тех пор, пока num_read меньше num.
- Внутри цикла открывается файл
С:\\file.bin
в бинарном режиме чтения (rb). - Перемещается указатель чтения в конец файла с помощью функций fseek и ftell.
- Вычисляется размер одного блока данных (Size_data) и количество блоков данных в файле (num).
- Если num_read меньше num, то происходит чтение данных из файла в массив Buffer с помощью функции fread.
- Если num_read равно num, то файл закрывается функцией fclose.
- Если чтение данных прошло успешно (d не равно 0), то увеличивается значение num_read на единицу.
- Если во время чтения возникла ошибка (d равно 0), то файл закрывается функцией fclose.
- В конце цикла do-while выполняется инструкция else, которая закрывает файл stream.
- Цикл do-while повторяется до тех пор, пока все данные из файла не будут прочитаны.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д