Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

ф-ия Read в CBUilder

Hello comp,

Добрый день!
может кто-нибудь обяснить следующееЖ
1. есть файл rez.dat 160 К неважно какого типа.
2. он читается следующим кодом

int handleIn = open("rez.dat",O_RDONLY);
unsigned char buffer[1500];

int fs=0;
do {
lseek(handleIn,fs,1);

bin=read(handleIn,&buffer[1],1024);
fs=fs+bin;
bufread++;
fprintf(stream," bin %i\n",bin);
} while (bin>0);
close(handleIn);

3/ Результат-

bin 897
Record: bin 828
Record: bin 88
Record: bin 850
Record: bin 389
Record: bin 377
Record: bin 125
Record: bin 1024
Record: bin 454
Record: bin 704
Record: bin 250
Record: bin 1024
Record: bin 1024
Record: bin 1024
Record: bin 1024
Record: bin 1023
Record: bin 1024
Record: bin 1023
Record: bin 1024
Record: bin 0 -1
всего из 160 к прочитано около 12 К и финиш. при этом как прочитано!
не по 1024 байтика!!

можжете подсказать почему?
заранее спасибо

Ols

Ответить   ol Mon, 26 Jan 2004 09:06:22 -0800 (#63600)

 

Ответы:

Здравствуйте, ol.

Вы писали 26 января 2004 г., 19:06:22:

Во-первых:
Эту строку надо дополнить

int handleIn = open("baze2.mdl",O_RDONLY|O_BINARY);

Как у тебя, файл интерпретируется как текстовый, и байты совпадающие
с контрольными кодами (как возврат коретки, конец строки и т.д.) не
учитываются.
После этого будет читаться по 1024б.

Во-вторых, непонятно, для чего каждый раз позиционировать. Ведь
функция read() делает это автоматически. Если закоментируешь функцию
lseek, то будет читаться больше чем 12К. А то у тебя и read
позиционирует куда надо, а потом ты ещё к той позиции прибавляешь
общее число прочитанных байтов и указатель переноситься далеко вперёд.
Если уж очень охота использовать эту фу-ю, вместо единицы в третьем
параметре (что соответствует SEEK_CUR - позиционирование от текущей позиции)
постав 0 = SEEK_SET - поз. от начала файла.

Эта строка то же не пригодиться, если без lseek будет.

Ответить   Mon, 26 Jan 2004 10:06:23 +0200 (#63648)

 

это вообще какие-то паскалевские замашки :)
достаточно
bin=read(handleIn,buffer,1024);

Ответить   Ivan Mikheikin Mon, 26 Jan 2004 12:43:30 +0300 (#63780)

 

Hello Yurij,

Monday, January 26, 2004, 12:06:23 AM, you wrote:

спасибо. BINARY помогло.
lseek я снял. -хоть вопросы по нему остались.
ведь позиционировал я на следующий байт для перестраховки.
спасибо!

Ответить   ol Mon, 26 Jan 2004 13:19:46 -0800 (#63801)

 

По умолчанию файл открывается в текстовом режиме (выполняется
преобразование cr/lf и обнаружение конца файла по символу eof).
Если файл двоичный, укажи соответствующий флаг:

int handleIn = open("rez.dat",O_RDONLY|_O_BINARY);
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Mon, 26 Jan 2004 11:16:46 +0300 (#63656)

 

Hello Емельянов,

Monday, January 26, 2004, 12:16:46 AM, you wrote:

спасибо. BINARY помогло.

Ответить   ol Mon, 26 Jan 2004 13:21:55 -0800 (#63802)