Вопрос по функции_read

Создание исполняемых модулей для электронных ключей SenseLock

Вопрос по функции_read

Сообщение vladpol » Чт, 13 май 2010 01:12

В описании функции _read указано

Параметры:
handle [in] Указатель на дескриптор открытого файла
wOffset [in] Смещение в файле
bLength [in] Длина читаемых данных (от 1 до 247 байт)
pbBuff [out] Указатель на буфер, куда будут считаны данные

Вопрос по параметру bLength: правильно ли я понимаю, что для того считать файл с длинной более 247 байт нужно последовательно несколько раз вызывать эту функцию меняя параметр wOffset и вопрос "2" если указать параметр задать bLength больше чем реального объема данных, нормально ли отработает данная функция

Или как правильно прочитать файл?
vladpol
 
Сообщения: 3
Зарегистрирован: Вс, 21 мар 2010 22:38

Re: Вопрос по функции_read

Сообщение hijaq » Пт, 14 май 2010 15:20

Да, чтобы прочитать более 247 байт - необходимо в цикле читать несколько раз, изменяя смещение.
В случае, если размер читаемых данных больше, чем физически присутствует в файле - возвращается ошибка SES_RANGE.
hijaq
Site Admin
 
Сообщения: 213
Зарегистрирован: Пт, 06 апр 2007 14:50

Re: Вопрос по функции_read

Сообщение dalex » Пн, 05 июл 2010 15:13

Как определить размер файла, что бы не получать ошибку SES_RANGE? Или же в этом случае в pbBuff будут данные, от начала смещения до конца файла?
И ещё вопрос: почему то при попытке прочитать больше 128 байт одним махом так же получаю ошибку SES_RANGE, но тем не менее, если считывать 128 байт со смещением (т.е. в файле больше 128 байт), то всё нормально?
dalex
 
Сообщения: 1
Зарегистрирован: Пн, 05 июл 2010 15:07

Re: Вопрос по функции_read

Сообщение hijaq » Чт, 13 июн 2013 13:01

Размер файла определить нельзя. Вообще, предполагается, что в подобных маленьких и ограниченных системах вы имеете дело с файлами заранее известного размера или структуры. Если у вас динамический размер файла, то тогда необходимо или внутри этого файла прописывать размеры, количество блоков данных и пр. служебную информацию, или делать "умную" вычитку, которая умеет обрабатывать ошибку SES_RANGE.

Пример вычитки 247 байт одним махом, никаких ошибок не возникает, смотрите свой код.

Код: Выделить всё
#include "ses_v3.h"

unsigned char d[247];

void main(void)
{
   HANDLE h;
   unsigned char error = 0;
   
   error = _open(0x1001, &h);
   if (error == SES_SUCCESS) {
      error = _read(h, 0, sizeof(d), d);
      _close(h);
   }
   
   if (error == SES_SUCCESS) {
      _set_response(sizeof(d), d);
   } else {
      _set_response(sizeof(error), (unsigned char *)&error);
   }
   _exit();
}
hijaq
Site Admin
 
Сообщения: 213
Зарегистрирован: Пт, 06 апр 2007 14:50


Вернуться в Исполняемые модули

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron