Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > как определить размер буфера


Автор: ZC1989 9.1.2007, 11:59
вобщем я тут уже советовался на подобную тему, но щас вопросец другой...

надо прочитать файл из архива, для этого надо передать в фенкию чтения буффер и размер не жатого файла, со вторым всё просто, размер я узнаю прочитав инфу о файле...

а вот как определить размер бефера?

я делаю щас так, в принципе нормальный результат получается, но иногда шибки, или не всё читается или лишнее...
Код

Buffer = new voidp[(UnZInfo.uncompressed_size/sizeof(voidp))-sizeof(voidp)];
if(unzReadCurrentFile(UnZFile, Buffer, UnZInfo.uncompressed_size) < 0) return false;
MessageBox(0, (char *)Buffer, "", 0);

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

здесь UnZInfo.uncompressed_size - размер не жатого файла; а тип voidp по сути то же что и void...

как мне превильно задавать размер буфера что бы было идеально под размер файла? smile 

Автор: Sartorius 9.1.2007, 12:03
Цитата

voidp по сути то же что и void...


наверно void * ...
В любом случае непонятно, почему не char.
Код


Buffer = new char[UnZInfo.uncompressed_size];

Автор: Daevaorn 9.1.2007, 12:04
Цитата(ZC1989 @  9.1.2007,  12:59 Найти цитируемый пост)
а тип voidp по сути то же что и void...

по сути, если это тоже самое, то это не скомпилируется.
Цитата(ZC1989 @  9.1.2007,  12:59 Найти цитируемый пост)
[(UnZInfo.uncompressed_size/sizeof(voidp))-sizeof(voidp)];

вот эта высшая математика явно лишняя.
Зачем мудрить?
Код

Buffer = new char[ UnZInfo.uncompressed_size ];

Автор: ZC1989 9.1.2007, 12:06
Daevaorn, надо определить точно размер иначе вообще ошибка функией даётся...
Цитата

Зачем мудрить?
Выделить всёкод C++
1:
Buffer = new char[ UnZInfo.uncompressed_size ];



потому что слишком много

Автор: Daevaorn 9.1.2007, 12:07
ааа, voidp это void*, тогда Buffer имеет тип void** или что-то такое.
Код

void** Buffer = new void*[ UnZInfo.uncompressed_size / sizeof( voidp )];

Не понятно правда зачем так

Автор: ZC1989 9.1.2007, 12:07
Sartorius, да, * забыл... извиняйте...

Автор: Sartorius 9.1.2007, 12:08
 Уже ответили  smile  (удалил)

Автор: Daevaorn 9.1.2007, 12:08
Цитата(ZC1989 @  9.1.2007,  13:06 Найти цитируемый пост)
надо определить точно размер 

a UnZInfo.uncompressed_size это не точный размер?
давай лучше сигнатуру функции unzReadCurrentFile напиши

Автор: ZC1989 9.1.2007, 12:08
Daevaorn, это не я придумал... это для ZIPа нужно... ему ток свой, наследованный от void*voidp тип понятен

Добавлено @ 12:09 
Цитата

extern int ZEXPORT unzReadCurrentFile OF((unzFile file, 
       voidp buf,
       unsigned len));
/*
  Read bytes from the current file (opened by unzOpenCurrentFile)
  buf contain buffer where data must be copied
  len the size of buf.

  return the number of byte copied if somes bytes are copied
  return 0 if the end of file was reached
  return <0 with error code if there is an error
    (UNZ_ERRNO for IO error, or zLib error for uncompress error)
*/

Автор: Daevaorn 9.1.2007, 12:11
ZC1989, тогда точно подходит, что мы тебе с Sartorius написали вначале

Автор: ZC1989 9.1.2007, 12:15
Daevaorn, я пробовал сотню раз...не подходит... при выводе после последнего символа идёт куча левых символов... тупо мусор...  в том варианте который в начале мой написан, погрешность получается до 1 символа... как я понимаю это из-за того что в одном voidp (типа эллементе массива) хранится 5 или 6 символов типа char... такая вот фишка...

Автор: Daevaorn 9.1.2007, 12:19
Цитата(ZC1989 @  9.1.2007,  13:15 Найти цитируемый пост)
я пробовал сотню раз...не подходит

а один раз заглянуть в книжку не пробовал?smile Мусор в конце, это не значит что что-то не правильно. Это значит, что просто '\0' нет в конце, который тебе надо поставить самому.

Добавлено @ 12:21 
посмотри также на MessageBox , что ей нужно в качестве второго параметра. 

Автор: ZC1989 9.1.2007, 12:21
Daevaorn, так вот в связи с тем что в одним эллементе этого voidp несколько символов содержиться и возникает сложность поставить этот \0 - про него я помню всегда smile 

Автор: Daevaorn 9.1.2007, 12:23
Цитата(ZC1989 @  9.1.2007,  13:21 Найти цитируемый пост)
вот в связи с тем что в одним массиве этого voidp несколько символов содержиться 

причем тут voidp?
Код

char*Buffer = new char[ UnZInfo.uncompressed_size + 1 ];
if(unzReadCurrentFile(UnZFile, Buffer, UnZInfo.uncompressed_size) < 0) return false;
Buffer[ UnZInfo.uncompressed_size ] = 0;
MessageBox(0, Buffer, "", 0);

Автор: ZC1989 9.1.2007, 12:24
Цитата

Добавлено @ 13:21 
посмотри также на MessageBox , что ей нужно в качестве второго параметра.  

это название окна... в данном случае окно без названия smile 

Автор: Sartorius 9.1.2007, 12:30
http://www.gamedev.ru/articles/?id=70122

Автор: ZC1989 9.1.2007, 12:31
Цитата
причем тут voidp?
char*Buffer = new char[ UnZInfo.uncompressed_size + 1 ];
if(unzReadCurrentFile(UnZFile, Buffer, UnZInfo.uncompressed_size) < 0) return false;
Buffer[ UnZInfo.uncompressed_size ] = 0;
MessageBox(0, Buffer, "", 0);


ядрёны пасатижы! это сработало! ни каких ошибок! СПАСИБО!  smile 

Автор: Daevaorn 9.1.2007, 12:31
Цитата(ZC1989 @  9.1.2007,  13:24 Найти цитируемый пост)
ядрёны пасатижы! это сработало! ни каких ошибок! СПАСИБО!

smile

Автор: ZC1989 9.1.2007, 12:32
Sartorius, пасибо, но именно этот урок и был самым нормальным по ZIP, что я нашёл в сети... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)