Чтение бинарного файла на втором проходе цикла завершается с ошибкой - 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 повторяется до тех пор, пока все данные из файла не будут прочитаны.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д