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