Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Игнат116
1 / 1 / 1
Регистрация: 16.09.2011
Сообщений: 17
#1

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

11.06.2015, 18:05. Просмотров 1083. Ответов 6
Метки нет (Все метки)

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

Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2015, 18:05
Ответы с готовыми решениями:

Чтение строк файла - остается лишний символ при очередном проходе
Здраствуйте. Есть функция которая циклично считывает строки и числа со...

Чтение из бинарного файла
Здравствуйте. Почему такой код работает: while((c = fgetc(fin)) != EOF) ...

Чтение бинарного файла
Как считать файл с помошью fread - в файле первые 4 байта вот такие 00 00 00...

Запись и чтение бинарного файла
Доброго времени суток! Уже какой час бьюсь над проблемой и не могу никак...

Чтение строки из бинарного файла
вопрос в шапке: как считать строку из бинарного файла? размер строки не...

6
drfaust
309 / 200 / 76
Регистрация: 02.10.2008
Сообщений: 794
Записей в блоге: 1
Завершенные тесты: 1
11.06.2015, 18:52 #2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от Игнат116 Посмотреть сообщение
C
1
2
3
4
5
6
7
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); /*ЗАЧЕМ ЗАКРЫВАТЬ ФАЙЛ ВНУТРИ ЦИКЛА ????*/
* * }
Ответ в коментарии
1
Игнат116
1 / 1 / 1
Регистрация: 16.09.2011
Сообщений: 17
11.06.2015, 23:23  [ТС] #3
Файл закрываю для того чтобы не мешать записи "свежих" данных в файл. Данные могут приходят каждую секунду,а вот обработка одного блока данных занимает у меня 5 секунд.
0
drfaust
309 / 200 / 76
Регистрация: 02.10.2008
Сообщений: 794
Записей в блоге: 1
Завершенные тесты: 1
12.06.2015, 01:38 #4
Ага, а как fread будет читать из закрытого файла, то же касается и fseek?
0
Игнат116
1 / 1 / 1
Регистрация: 16.09.2011
Сообщений: 17
12.06.2015, 13:33  [ТС] #5
Ну для меня это было главное,не мешать записи файлу,поэтому как то даже и не думал по другому делать. Сделал do while цикл,все работает. Еще раз спасибо.
0
drfaust
309 / 200 / 76
Регистрация: 02.10.2008
Сообщений: 794
Записей в блоге: 1
Завершенные тесты: 1
12.06.2015, 19:22 #6
Приведи код, ибо если while на do_while сменить - ошибка не исчезнет(приобретёт другой вид) - ВСЕ ОПЕРАЦИИ С ФАЙЛАМИ ТОЛЬКО ЕСЛИ ФАЙЛ ОТКРЫТ
0
Игнат116
1 / 1 / 1
Регистрация: 16.09.2011
Сообщений: 17
18.06.2015, 11:44  [ТС] #7
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Вот так получилось.

Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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);
0
18.06.2015, 11:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2015, 11:44

Запись/чтение бинарного файла
У меня есть процедура которая на вход принимает строку , имя файла , и...

Модифицированный бинарный поиск: программа завершается с ошибкой
Доброго времени суток. Чутка модифицировал функцию бинарного поиска и теперь...

Импорт данных из Excel-файла завершается с ошибкой
Пишу вот: public void GetDataTableExcel(string fileName) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru