Большой Воронежский Форум
Страница 1 из 3
1 23 >
» Программирование>Помогите с записью в бинарный файл
-=Женек=- 20:03 23.05.2010
Господа, я занимаюсь разработкой девайса на ARM7, работающего с цветным дисплеем. Для вывода картинок мне понадобился ковертер. Вначале я просто создавал текстовый файл, куда записывал значения пикселей, проблем не было. Теперь же мне понадобилась запись в бинарник.

Вот код.

Сообщение от :

void __fastcall TForm1::FileSaveDialog_BINFileOkClick(TObject *Sender, bool &CanClose)

{

FILE *stream1;
TColor PixColor;
AnsiString A;
unsigned int x,y;

stream1 = fopen(AnsiString(FileSaveDialog_BIN->FileName).c_str(),"w");
if(stream1)
{
fprintf(stream1, "%d", Image->Picture->Width);

for(int j=0; j < Image->Picture->Height; j++)
{
for(int i = 0; i < Image->Picture->Width; i++)
{
fprintf(stream1, "%u", GetRValue(Image->Canvas->Pixels[i][j]));
fprintf(stream1, "%u", GetGValue(Image->Canvas->Pixels[i][j]));
fprintf(stream1, "%u", GetBValue(Image->Canvas->Pixels[i][j]));

}
}


fclose(stream1);
}

}


Если скормить ему картинку с единственным пикселом красного цвета, то он запишет в файл "1125500" , то есть высота 1, ширина 1, RValue 255, GValue 0, BValue 0

Мне нужно заставить его писать не значение цвета, а символ с кодом, равным значению цвета, причем высота и ширина должны использовать два байта.
Подмогните, пробовал %b - не получается. [Ответ]
Part!zan 21:19 23.05.2010
-=Женек=-, как-то ты очень сложно сделал... Заведи структуру с нужными полями и пиши ее через fwrite. Примерно вот так:

Код:
struct {
unsigned char r;
unsigned char g;
unsigned char b;
} COLOR;

struct COLOR color;

fwrite(&color,sizeof(color),1,stream1)
Кстати, раз уж ты создаешь бинарный файл, то и флаг b ему при создании надо ставить. [Ответ]
-=Женек=- 21:58 23.05.2010
Спасибо, уже сам допер про fwrite. А за совет про структуру спасибо. [Ответ]
Part!zan 22:02 23.05.2010
-=Женек=-, кстати, возможно, нужно будет изменить настройки выравнивания данных, чтобы компилятор не выравнивал поля в структуре по дворду. [Ответ]
alexz 22:28 23.05.2010

Сообщение от -=Женек=-:
Господа, я занимаюсь разработкой девайса на ARM7, работающего с цветным дисплеем.


Блин,круто. А где у нас в Воронеже такие задачи возникают? Для чего девайс? Если не секрет, конечно. [Ответ]
-=Женек=- 06:23 24.05.2010
В общем получилось. Успешно конвертирую BMP в BIN и вывожу на экран.

Сообщение от alexz:
Блин,круто. А где у нас в Воронеже такие задачи возникают? Для чего девайс? Если не секрет, конечно.

Где в Воронеже - не знаю. Лично я любитель самоучка, делаю для себя. А где можно использовать дисплей? Да учитывая современные веяния - где угодно. Девайс с дисплеем будет использоваться для управления и настройки основного устройства по радио. [Ответ]
Spectator 11:07 24.05.2010
Изучайте WinAPI, уходите от функций fopen/fread/...., они устарели уже десять лет как.
Открываем MSDN и читаем про CreateFile, WriteFile, CloseHandle.
Причем, очевидный плюс API - всегда доступный (если есть интернет) и разжеванный до мелочей Help. [Ответ]
MadFish 11:34 24.05.2010
Spectator, маЛчик, а ты вкурсе что есть и други ОС кроме Win? и "о ужас" железки могут работать и вообще без ОС??? [Ответ]
-=Женек=- 12:21 24.05.2010

Сообщение от MadFish:
Spectator, маЛчик, а ты вкурсе что есть и други ОС кроме Win? и "о ужас" железки могут работать и вообще без ОС???

А еще есть FatFS для микроконтроллеров и SD, в которое используется f_mount и f_read. Ужасть.... [Ответ]
Part!zan 20:51 24.05.2010
Spectator, товарищ, вы что-нть слышали про C Run-Time Library? Так вот, эти функции в нее входят. А устареть она не может, потому что это одна из основных составляющих языка. Короче, прекратите демонстрировать свою безграмотность. [Ответ]
Spectator 11:49 27.05.2010

Сообщение от MadFish:
Spectator, маЛчик, а ты вкурсе что есть и други ОС кроме Win? и "о ужас" железки могут работать и вообще без ОС???

а) Я не мальчик
б) Я вполне способен отличить код на чистых сях от кода под Builder/CodeGear, так вот - приведен последний.
Еще вопросы?

Сообщение от Part!zan:
Spectator, товарищ, вы что-нть слышали про C Run-Time Library? Так вот, эти функции в нее входят. А устареть она не может, потому что это одна из основных составляющих языка. Короче, прекратите демонстрировать свою безграмотность.

Может в нее входят классы TImage и TCanvas?)))
Image->Canvas->Pixels[i][j] [Ответ]
Part!zan 19:19 27.05.2010
Spectator, не надо передергивать. Какая связь между билдером и CRT?

Сообщение от Spectator:
уходите от функций fopen/fread/...., они устарели уже десять лет как

это твои слова? твои. так что нефиг. облажался - обтекай. [Ответ]
Spectator 20:22 27.05.2010

Сообщение от Part!zan:
это твои слова? твои. так что нефиг. облажался - обтекай.

Я не облажался)) Почему код - явно под Windows, я уже объяснил. Почему функция fcreate устарела, потому что она не поддерживает всех тех возможностей, которые предоставляет CreateFile. Кроме того, функции, имеющие прямые аналоги в API вообще лучше использовать напрямую, поскольку функция fread - лишь обертка для CreateFile, причем обвертка на уровне библиотеки, а не разрешается на уровне компиляции, что значит что во время выполнения будет вызвана функция из библиотеки из которой будет вызвана функция CreateFile, распарсив и преобразовав предварительно параметры ("r" => GENERIC_READ). А это совершенно ненужная трата процессорного времени. [Ответ]
Part!zan 21:26 27.05.2010
Spectator, не надо высасывать объяснения из пальца. Каждая функция имеет свое применение, топикстартеру нафиг не сдались все те замечательные вещи, которые умеет CreateFile.

Сообщение от Spectator:
Кроме того, функции, имеющие прямые аналоги в API вообще лучше использовать напрямую

Это кто такое сказал? Мне совершенно пофигу, что использование обертки на несколько микросекунд задержит выполнение кода, а с учетом того, что разговор идет о дисковых операциях, то рассуждать о преимуществе по скорости просто смешно. Зато пользоваться CRT функциями удобнее за счет более простого синтаксиса. Ты еще предложи написать все на асме... [Ответ]
X0R 21:38 27.05.2010

Сообщение от Spectator:
функция fread - лишь обертка для CreateFile

CreateFile это тоже обертка... [Ответ]
Spectator 21:48 27.05.2010

Сообщение от Part!zan:
Spectator, не надо высасывать объяснения из пальца. Каждая функция имеет свое применение, топикстартеру нафиг не сдались все те замечательные вещи, которые умеет CreateFile.

Никто ничего не высасывает. Успокойся, милая, мы никуда не едем (с)
Утомлять ты меня уже стал))))

Сообщение от Part!zan:
Это кто такое сказал? Мне совершенно пофигу, что использование обертки на несколько микросекунд задержит выполнение кода, а с учетом того, что разговор идет о дисковых операциях, то рассуждать о преимуществе по скорости просто смешно. Зато пользоваться CRT функциями удобнее за счет более простого синтаксиса. Ты еще предложи написать все на асме...

Использование родных функций операционной системы не только ускоряет работу кода (что только в данном случае не особо критично), но и минимизирует количество ошибок, вызванных тем что между программистом и API функцией стоит другой код, со своими глюками и подводными камнями.
Единственный плюс - переносимость кода, если она не нужна, нет НИКАКИХ преимуществ от использования обверток.
Кроме того что это проще)) Ну да это личное дело каждого, мне не лень открыть MSDN и прочитать внимательно что делает каждая функция)))
З.Ы. Это я сказал))) [Ответ]
Spectator 21:51 27.05.2010

Сообщение от X0R:
CreateFile это тоже обертка...

CreateFile - API функция, поддержку которой гарантирует Microsoft в ближайших версиях операционной системы. Можно использовать напрямую и функции низших библиотек, но это гарантированно вызовет несовместимость программы с последующими версиями OS.
А если Вы про CreateFileA и CreateFileW, то такие вещи разрешаются на уровне компиляции)))) Хотя использование CreateFileA в ТОЖЕ нецелесообразно в новейших системах Windows, поскольку это обвертка для CreateFileW))) Но уже на уровне самой операционной системы, а не библиотек, используемых при компиляции)) [Ответ]
X0R 22:13 27.05.2010
Я про NtCreateFile. Аккуратное использование параметров и тестирование на разных версиях ОС приведет к стабильной работе и "ускорит" выполнение кода.
Зачем заполнять 7 параметров функции CreateFile вместо 2-3-х у библиотечных, тем более что очевидно, что никакого преимущества в данном случае это не даст. [Ответ]
Spectator 22:21 27.05.2010

Сообщение от X0R:
Я про NtCreateFile. Аккуратное использование параметров и тестирование на разных версиях ОС приведет к стабильной работе и "ускорит" выполнение кода.

NtCreateFile НЕ является API функцией, а является ВНУТРЕННЕЙ функцией, а потому поддержка этой функции в последующих версиях Windows НЕ гарантируется.
Тогда как CreateFileW - ЯВЛЯЕТСЯ API функией и ее поддержка ГАРАНТИРУЕТСЯ в ближайших версиях операционной системы.
Поэтому разницы между fopen и CreateFileW особо нет - на десяток лет хватит, а потом программа устареет. А вот разница между CreateFileW и NtCreateFile есть - в ЛЮБОЙ последующей версии Windows ее уже может не быть, Билли тут ничего не обещает - это недокументированная функция.

Сообщение от X0R:
Зачем заполнять 7 параметров функции CreateFile вместо 2-3-х у библиотечных, тем более что очевидно, что никакого преимущества в данном случае это не даст.

Уже хотя бы затем что ты не понимаешь при этом какие конкретно параметры передаются в CreateFile и как при каких обстоятельствах этот код сработает, а при каких - нет))) Вот будет ли файл открыт с FILE_SHARE_READ или не будет?))) Нигде ты ответа на это не найдешь - зависит от компилятора))) Вернее - библиотек компилятора. Или даже не компилятора, что еще забавнее - у тебя код работает, а у Васи - не работает. Потому что у него динамическая версия от одного компилятора, а у тебя - от другого.
[Ответ]
X0R 22:32 27.05.2010

Сообщение от Spectator:
Билли тут ничего не обещает - это недокументированная функция.

это пять.. http://msdn.microsoft.com/en-us/libr...80(VS.85).aspx [Ответ]
Spectator 22:49 27.05.2010

Сообщение от X0R:
это пять.. http://msdn.microsoft.com/en-us/libr...80(VS.85).aspx

Ну и? Смотрим первую ссылку: Note Before using this function, please read Calling Internal APIs.

Что видим:
The caveat at http://msdn.microsoft.com/library/de...library/en-us/ devnotes/winprog/calling_internal_apis.asp claims that they reserve the right to change this without notice, so I hesitate to program against it.

То что они изменили политику и стали называть ранее недокументированные функции внутренними и приводить их описание - ну не знал. Раньше было не так. Факт остается фактом - они оставляют за собой право менять их или убирать из OS, что может привести к непредсказуемым последствиям. [Ответ]
X0R 22:53 27.05.2010
Spectator, ды если бы эти функции не были документированы, как бы люди дрова писали? Реверсили бы все ядро? [Ответ]
Spectator 22:57 27.05.2010

Сообщение от X0R:
Spectator, ды если бы эти функции не были документированы, как бы люди дрова писали? Реверсили бы все ядро?

Есть специальные библиотеки для драйверов, они вполне документированы)))
Это называется DDK - Driver Development Kit))) (сравните с SDK - Software Develompent Kit) ))))

А это ВНУТРЕННЯЯ функция операционной системы, она и не для Sofware и не для Driver'ов))) А внутре у ней думатель (с) А и Б Стругацкие))) [Ответ]
X0R 23:10 27.05.2010

Сообщение от Spectator:
Есть специальные библиотеки для драйверов, они вполне документированы)))

Сообщение от Spectator:
А это ВНУТРЕННЯЯ функция операционной системы, она и не для Sofware и не для Driver'ов)))

о как оно. И какой же аналог функции CreateFile предлагается разработчикам драйверов? [Ответ]
Part!zan 23:15 27.05.2010

Сообщение от Spectator:
вызванных тем что между программистом и API функцией стоит другой код, со своими глюками и подводными камнями

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

Сообщение от Spectator:
они оставляют за собой право менять их или убирать из OS, что может привести к непредсказуемым последствиям

И чо? В висте, например, некоторые вещи, работавшие в ХР, перестали работать. Вполне "законные" и "документированные". Теперь всех программеров, которые их использовали, надо на кол посадить за это, по-твоему? "Не болтайте ерундой"

Короче, нравится писать на одном API - пиши, только не надо тут всех убеждать, что это самый лучший и быстрый способ. Для каждой задачи свои методы решения. Если ты этого не уразумел до сих пор - тебе же хуже. [Ответ]
MadFish 14:24 28.05.2010
Spectator, ну во первых, по исходникам на С\С++ нельзя определить под какую платформу ведется разработка!!! С\С++-язык, а какая платформа это одному компилятору известно. На спор могу приведенный выше исходник откомпилить под линух(еще под рукой есть макос, и AIX для PowerV, могу и под них, а также досы и винды любой версии)
во вторых есть такой стандарт POSIX который мелкомягкие пытаются поддерживать, или он тоже по твоему устарел? и если тебя так заботит поддержку чего там гарантирует компания из ричмонда, то лучше уж юзать fread они ее будут поддерживать ВСЕГДА ))) ну или хотябы до той поры пока не начнуть разрабатывать ядро ОС на Visual Basic )))
ну и в третих, как уже тут писали, а если мне не нужно все то гавно в виде хендлов, уровней доступа ипр, ну вот нафига мне юзать WinApi? если мне тупо записать и считать файл надо, и че? Кстити CRT у VC тоже мелкомягкие делали, так вот пусть у них голова и болит за какую функцию API они будут дергать.
ну и напоследок вопросец(раз ты разрешил), че, недавно начал програмить? Или просто месяц назад купил книжку по WinApi? [Ответ]
Spectator 19:22 28.05.2010

Сообщение от X0R:
о как оно. И какой же аналог функции CreateFile предлагается разработчикам драйверов?

Я не понимаю вопроса и специальная функция CreateFile)))) Исходя из каких моих слов Вы решили что таковая должна существовать?) [Ответ]
X0R 19:28 28.05.2010
Spectator, спрошу иначе, раз не понятно. Разработчики драйверов тоже используют CreateFile? [Ответ]
Spectator 19:29 28.05.2010

Сообщение от MadFish:
Spectator, ну во первых, по исходникам на С\С++ нельзя определить под какую платформу ведется разработка!!!

А во-вторых это можно определить по ФУНКЦИЯМ, которые используются.

Сообщение от MadFish:
во вторых есть такой стандарт POSIX который мелкомягкие пытаются поддерживать, или он тоже по твоему устарел?

Не вижу никакой связи)))

Сообщение от MadFish:
и если тебя так заботит поддержку чего там гарантирует компания из ричмонда, то лучше уж юзать fread они ее будут поддерживать ВСЕГДА ))) ну или хотябы до той поры пока не начнуть разрабатывать ядро ОС на Visual Basic )))

Я вроде уже объяснял - какой смысл использовать родные функции OS))) То что функции будут поддерживаться всегда - это далеко не самое главное)))

Сообщение от MadFish:
ну и напоследок вопросец(раз ты разрешил), че, недавно начал програмить? Или просто месяц назад купил книжку по WinApi?

Сравнительно недавно, конкретно WinAPI я начал изучать 14 лет назад, профессионально работать - 12) [Ответ]
Spectator 19:41 28.05.2010

Сообщение от X0R:
Spectator, спрошу иначе, раз не понятно. Разработчики драйверов тоже используют CreateFile?

Я не уверен что функция CreateFile может быть использована в драйвере. К чему Вы клоните? [Ответ]
Страница 1 из 3
1 23 >
Вверх