Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » запись структур в VС++

Ответить
Настройки темы
запись структур в VС++

Новый участник


Сообщения: 29
Благодарности: 0

Профиль | Отправить PM | Цитировать


Проблема в следующем, есть bmp, gif или любой другой файл и мне нужно его прочитать. Для начала надо прочитать заголовок, который представлен в виде структуры. Но он читается не правильно, из-за “word alignment”, т.е. то, что меньше 4байт увеличивается до 4, что сами понимаете, в данном случае критично. Как убрать это выравнивание? (программа – Win32 Console Application)

Отправлено: 20:11, 14-02-2004

 

Аватара для Prisoner

Engrossed by the Void


Сообщения: 2229
Благодарности: 60

Профиль | Отправить PM | Цитировать


Возможно поможет директива #pragma pack n или опция компилятора -a.

[s]Исправлено: Prisoner, 11:15 16-02-2004[/s]

-------
Не могу дать более дельный совет - не хватает системных ресурсов...


Отправлено: 11:14, 16-02-2004 | #2



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

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


Новый участник


Сообщения: 29
Благодарности: 0

Профиль | Отправить PM | Цитировать


А можно немного поподробнее? как японяла надо примерно так:
#pragma pack(1) //работает почему-то только с 1, и то не совсем
struct {
char a;
long int b;
int c;
} info;
#pragma pack
а что означает 1 в pack(1) и как правильно записать дерективу компилятору "-a"

Отправлено: 18:05, 16-02-2004 | #3


Модер


Сообщения: 1716
Благодарности: 17

Профиль | Сайт | Отправить PM | Цитировать


1) 1 - выравнивание в байтах
2) push забыла

Добавлено:

То есть, должно быть

#pragma pack(push, 1)

КОД

#pragma pack(pop)

-------
Васкецов Сергей
http://registry.oszone.net


Отправлено: 19:57, 16-02-2004 | #4


Новый участник


Сообщения: 29
Благодарности: 0

Профиль | Отправить PM | Цитировать


Еще один вопросик, правда немного не на тему, но все же.... в общем еод должен считывать переменную, модифицировать ее и еласть на место, но этого не делает, в чем проблема?

f = fopen(f_name, "rb+";
unsigned char cur;
for (int i=0; i<350; i++) {
cur = fgetc(f);
fseek(f, -1, SEEK_CUR);
cur &= 0xF0;
fputc(cur, f);
}
fclose(f);

Отправлено: 18:48, 21-02-2004 | #5


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Drey
Код в общем-то правильный, но при длине файла меньше 350 байт будет работать некорректно. Вообще нужна куча проверок. Открылся ли файл, перевелся ли указатель... Иначе код небезопасный.

[s]Исправлено: hasherfrog, 11:06 26-02-2004[/s]

Отправлено: 11:05, 26-02-2004 | #6


Новый участник


Сообщения: 29
Благодарности: 0

Профиль | Отправить PM | Цитировать


а откуда берутся эти 350 байт... в смысле с чем это связано и как выполнять проверки?

Отправлено: 19:38, 26-02-2004 | #7


Пользователь


Сообщения: 135
Благодарности: 0

Профиль | Отправить PM | Цитировать


1 Создай буфер char buf[350];
2 считай туда свой фал
3 Изменяй в буфере что ты хочешь
4 Закатай буфер обратно в файл

Отправлено: 02:52, 27-02-2004 | #8


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


bilytur
Чтение блоком  - первое, что приходит в голову, Другое дело, что это не всегда то, что нужно. Если у файла размер не известен заранее, а сам файл двоичный, fgetc и fputc имеют право на жизнь. Ведь по сути это fread/fwrite(&ch,1,1, F). Поскольку размер файла скорее всего небольшой (но может быть и большим), память выделять статично - вроде как накладно, динамически - муторно. Вот тут и нужен "несолидный" fputc
Drey
Я что-то не понял, вопрос в том, где ошибка, или в том, что это такое и что оно вообще делает?
Я серьезно отношусь к вопросам. Если Вам нечего делать, делайте это в другом месте...

Отправлено: 09:36, 27-02-2004 | #9


Новый участник


Сообщения: 29
Благодарности: 0

Профиль | Отправить PM | Цитировать


bilytur, да, вообще так конечно можно сделать, но это не есть хорошо, потому что, во-первых, считывать нужно несколько блоков, во-вторых, размер блоков заранее неизвестен, в-третьих, не факт, что считывать придется из одного файла - в смысле количество файлов может быть и больше одного, именно поэтому я делаю потоковую обработку, т.е. чтение-запись.
Так, а теперь про код - он вроде правильный и работать должен правильно, но почему-то не работает, я никак не пойму почему. Прикол в том, что если переписать то же самое в виде:
f = fopen(f_name, "rb+";
unsigned char cur;
for (int i=0; i<350; i++) {
fseek(f, i, SEEK_SET);
cur = fgetc(f);
fseek(f, i, SEEK_SET);
cur &= 0xF0;
fputc(cur, f);
}
fclose(f);
все работать будет замечательно. Вот и в чем проблема того кода?

Добавлено:

hasherfrog, что он делает я знаю - сам писал... но на всякий случай уточню - считывает символ (указатель смещается на следующий), затем возвращаем указатель и записываем на его место измененный символ, т.е., грубо говоря, просто заменяем символ.

Отправлено: 16:37, 27-02-2004 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » запись структур в VС++

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
.NET - [решено] C# to C++ dll: Маршалинг(?) массива структур XCodeR Программирование и базы данных 4 22-01-2010 10:18
[решено] Отключенная учетная запись и запись с истекшим сроком действия. В чем разница? CaminoDeFlores Microsoft Windows NT/2000/2003 4 01-06-2009 09:30
C/C++ - Сравнение структур в языке 'С' t0lkman Программирование и базы данных 1 21-04-2008 14:30
Запись на CD Bahram_aka Автоматическая установка Windows 2000/XP/2003 2 31-01-2007 02:47
Запись на CD Arex Программное обеспечение Windows 14 03-03-2002 17:03




 
Переход