|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » запись структур в VС++ |
|
|
запись структур в VС++
|
Новый участник Сообщения: 29 |
Профиль | Отправить PM | Цитировать Проблема в следующем, есть bmp, gif или любой другой файл и мне нужно его прочитать. Для начала надо прочитать заголовок, который представлен в виде структуры. Но он читается не правильно, из-за “word alignment”, т.е. то, что меньше 4байт увеличивается до 4, что сами понимаете, в данном случае критично. Как убрать это выравнивание? (программа – Win32 Console Application)
|
|
Отправлено: 20:11, 14-02-2004 |
Engrossed by the Void Сообщения: 2229
|
Профиль | Отправить PM | Цитировать Возможно поможет директива #pragma pack n или опция компилятора -a.
[s]Исправлено: Prisoner, 11:15 16-02-2004[/s] |
------- Отправлено: 11:14, 16-02-2004 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 29
|
Профиль | Отправить 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
|
Профиль | Сайт | Отправить PM | Цитировать 1) 1 - выравнивание в байтах
2) push забыла Добавлено: То есть, должно быть #pragma pack(push, 1) КОД #pragma pack(pop) |
------- Отправлено: 19:57, 16-02-2004 | #4 |
Новый участник Сообщения: 29
|
Профиль | Отправить 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 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать Drey
Код в общем-то правильный, но при длине файла меньше 350 байт будет работать некорректно. Вообще нужна куча проверок. Открылся ли файл, перевелся ли указатель... Иначе код небезопасный. [s]Исправлено: hasherfrog, 11:06 26-02-2004[/s] |
Отправлено: 11:05, 26-02-2004 | #6 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать а откуда берутся эти 350 байт... в смысле с чем это связано и как выполнять проверки?
|
Отправлено: 19:38, 26-02-2004 | #7 |
Пользователь Сообщения: 135
|
Профиль | Отправить PM | Цитировать 1 Создай буфер char buf[350];
2 считай туда свой фал 3 Изменяй в буфере что ты хочешь 4 Закатай буфер обратно в файл |
Отправлено: 02:52, 27-02-2004 | #8 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать bilytur
Чтение блоком - первое, что приходит в голову, Другое дело, что это не всегда то, что нужно. Если у файла размер не известен заранее, а сам файл двоичный, fgetc и fputc имеют право на жизнь. Ведь по сути это fread/fwrite(&ch,1,1, F). Поскольку размер файла скорее всего небольшой (но может быть и большим), память выделять статично - вроде как накладно, динамически - муторно. Вот тут и нужен "несолидный" fputc Drey Я что-то не понял, вопрос в том, где ошибка, или в том, что это такое и что оно вообще делает? Я серьезно отношусь к вопросам. Если Вам нечего делать, делайте это в другом месте... |
Отправлено: 09:36, 27-02-2004 | #9 |
Новый участник Сообщения: 29
|
Профиль | Отправить 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 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
.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 |
|