запись структур в VС++

Аватара пользователя
Drey

Re: запись структур в VС++

Сообщение Drey »

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

Так, а теперь про код - он вроде правильный и работать должен правильно, но почему-то не работает, я никак не пойму почему. Прикол в том, что если переписать то же самое в виде:

f = fopen(f_name, "rb+&quotИзображение;

unsigned char cur;

for (int i=0; i
Аватара пользователя
Drey

Re: запись структур в VС++

Сообщение Drey »

ладно, это я переделаю на чтение блоками, а какого размера надо блоки брать?
Аватара пользователя
Drey

Re: запись структур в VС++

Сообщение Drey »

Drey

Размер ровное (двоичное) какое-нибудь число, лучше если кратное размеру кластера минимально это 512 байт.

А так исходи из собственных ресурсов 32K (0x8000) например неплохо.



Ну и раз пошла такая пьянка, еще пару слов.

По поводу первого твоего вопроса

#pragma pack(1) - Это конечно хорошо, но не портабельно.

Если ты делаешь программку для одной платформы с интеловсим процем, то так конечно проще всего.

Но если твой код будет компилироваться под другие платформы (процесоры), то там возможны засады.

Интеловские процы пишут младший байт сначала, на других системах возможно все будет наоборот, и тогда твои (bmp, gif) будут не валидными.
Аватара пользователя
Drey

Re: запись структур в VС++

Сообщение Drey »

bilytur, да, я читал на MSDN про эту фишку и там говориться, что лучше использовать ключевые слова, только есть одно "но" - они не воспринимаются компилятором, т.е. он говорит, что данная версия это не поддерживает.

Ладно, если #pragma pack(1) это не то, то что же тогда то? как это исправить?

Причем надо читать отдельно заголовок и отдельно содержимое - это приниципиально.





[s]Исправлено: Prisoner, 0:24 2-03-2004[/s]
Аватара пользователя
ivank

Re: запись структур в VС++

Сообщение ivank »

Читай/пиши побайтово (можно, что бы побыстрей, в буффер весь заголвок, а из него побайтово "расфасовывать&quotИзображение. Тогда не будет проблем с переносимостью между big/little-endian арзитектурами, с выравниванием проблем тоже не будет. По-моему, все портабельные программы работающие с бинарными данными делают именно так.
Аватара пользователя
bilytur

Re: запись структур в VС++

Сообщение bilytur »

Ну ivank Как всегда прав.

Вот небольшой пример.

Две функции для чтения и записи 32-разрядного целого.



Код:

Код: Выделить всё

__int32 ReadINT(void* pS)
{
  unsigned char* p = (unsigned char*)pS;
  __int32 res = p[3];
  res = (res<<8) | p[2];
  res = (res<<8) | p[1];
  res = (res<<8) | p[0];
  return  res;
}
void WriteINT(__int32 V, void* pD)
{
  unsigned char* p = (unsigned char*)pD;
  *p++ = V; V>>=8;
  *p++ = V; V>>=8;
  *p++ = V; V>>=8;
  *p   = V;
}

Как использовать. Пример:

Например по смещению 38 надо считать число, прибавить 5 и записать назад.



Код:

Код: Выделить всё

char Buf[SIZE]; // Это твой буфер
int a = ReadINT(&Buf[38]);
a += 5;
WriteINT(a, &Buf[38]);

А вообще если тебе действительно не нужна портабельность то не заморачивайся с этим. Изображение
Аватара пользователя
Drey

Re: запись структур в VС++

Сообщение Drey »

прикольный код... правда я не понял, что он делает??? если p - указательна char, то после одного смещения на 8 бит он должен тихо сканчаться...

и, как я понял из вышесакзанного надо правильнее

char Buf[512];

int a = ReadINT(&Buf)
Аватара пользователя
Drey

Re: запись структур в VС++

Сообщение Drey »

Код правильный, даже синтаксических ошибок нет.


Цитата:



программа – Win32 Console Application



Если пишешь под виндоус то используй #pragma pack(push, 1)

И живи спокойно. Портабельность тебе судя по всему не грозит. Изображение
Ответить

Вернуться в «Программирование и базы данных»