Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как определить размер буфера 
V
    Опции темы
ZC1989
Дата 9.1.2007, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



вобщем я тут уже советовался на подобную тему, но щас вопросец другой...

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

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

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

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 


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Sartorius
Дата 9.1.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Цитата

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


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


Buffer = new char[UnZInfo.uncompressed_size];

PM MAIL ICQ   Вверх
Daevaorn
Дата 9.1.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(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 ];

PM MAIL WWW   Вверх
ZC1989
Дата 9.1.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



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

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



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


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Daevaorn
Дата 9.1.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



ааа, voidp это void*, тогда Buffer имеет тип void** или что-то такое.
Код

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

Не понятно правда зачем так
PM MAIL WWW   Вверх
ZC1989
Дата 9.1.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



Sartorius, да, * забыл... извиняйте...


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Sartorius
Дата 9.1.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



 Уже ответили  smile  (удалил)

Это сообщение отредактировал(а) Sartorius - 9.1.2007, 12:08
PM MAIL ICQ   Вверх
Daevaorn
Дата 9.1.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



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

a UnZInfo.uncompressed_size это не точный размер?
давай лучше сигнатуру функции unzReadCurrentFile напиши
PM MAIL WWW   Вверх
ZC1989
Дата 9.1.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



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)
*/



--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Daevaorn
Дата 9.1.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



ZC1989, тогда точно подходит, что мы тебе с Sartorius написали вначале
PM MAIL WWW   Вверх
ZC1989
Дата 9.1.2007, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



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


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Daevaorn
Дата 9.1.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



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

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

Добавлено @ 12:21 
посмотри также на MessageBox , что ей нужно в качестве второго параметра. 
PM MAIL WWW   Вверх
ZC1989
Дата 9.1.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



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

Это сообщение отредактировал(а) ZC1989 - 9.1.2007, 12:23


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Daevaorn
Дата 9.1.2007, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(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);

PM MAIL WWW   Вверх
ZC1989
Дата 9.1.2007, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



Цитата

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

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


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0603 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.