Название: Запись в бинарник. Отправлено: Primordial от Апрель 19, 2012, 15:20 Приветствую. С Qt общаюсь пару дней только. Возник вопрос. Есть необходимость скинуть данные в бинарный файл. В общих чертах структура файла должна быть такова: хидер - пакет_0 - пакет_1 - ... - пакет_n. Т.е. сначала должны быть сформированы в памяти нужные пакеты данных, потом заголовок (на основании наличия\отсутствия пакета, его размера и пр.) и лишь в конце все должно быть записано в файл. Вопрос, собственно, как это реализовать средствами Qt?
Как я понимаю, класс QDataSrteam приспособлен для ввода данных в QIODevice вообще и, например, в QBuffer, в частности. Как записать данные в буфер, а из него в файл? Например в C# это легко решается с помощью BinaryWriter\MemoryStream. Надо что-то похожее. Название: Re: Запись в бинарник. Отправлено: Странник от Апрель 19, 2012, 15:29 ну так и пишите в QByteArray, а потом записывайте QFile. если вам в самом деле необходимо сформировать файл в памяти.
или пишите сразу на диск: пустой заголовок, пакеты, а потом возвращаетесь и перезаписываете заголовок. Название: Re: Запись в бинарник. Отправлено: _OLEGator_ от Апрель 19, 2012, 15:34 Так напрямую и здесь решается.
Код QFile унаследован от QIODevice. Название: Re: Запись в бинарник. Отправлено: Primordial от Апрель 20, 2012, 23:26 Благодарю, в общем разобрался немного.
Цитировать или пишите сразу на диск: пустой заголовок, пакеты, а потом возвращаетесь и перезаписываете заголовок. Не, так не стоит. Вдруг я решу сделать хидер не фиксированного размера. Да и некрасиво как-то.Но остался еще такой момент. Я до недавнего времени на Delphi в основном писал, так что некоторые особенности C++ мне очень непривычны. В общих чертах последовательность моих действий такова: Код: void ProcessData() Название: Re: Запись в бинарник. Отправлено: navrocky от Апрель 20, 2012, 23:32 При раскрутке стека по исключению, QFile в деструкторе зовет close(), так что не стоит волноваться. Также почитайте о RAII, этот подход полезно использовать при работе с исключениям. Да и вообще удобно.
Я знаю как ломает, когда с Дельфи приходишь а в плюсцах нету try/finally :D Название: Re: Запись в бинарник. Отправлено: Primordial от Апрель 20, 2012, 23:44 Ну я так и полагал, но решил уточнить на всякий случай :)
И еще по теме. У меня в классе экспортера имеется ряд буферов типа Код: QBuffer buf_Packet_0; Код: buf_Packet_0.buffer().resize(0); Название: Re: Запись в бинарник. Отправлено: navrocky от Апрель 20, 2012, 23:51 Ну по поводу надо или нет ничего не скажу, но очистка такая вроде должна прокатить. Также можно очистить следующими способами:
Код
и определись с codestyle: bufPacket0 или buf_packet_0... Название: Re: Запись в бинарник. Отправлено: Primordial от Апрель 21, 2012, 22:37 Походу проще все : void QByteArray::clear (). Что-то я с первого взгляда не обнаружил этой ф-ции, удивился даже.
Еще один вопрос. Допустим есть код типа такого: Код: void DoSomething() Название: Re: Запись в бинарник. Отправлено: V1KT0P от Апрель 21, 2012, 22:45 Походу проще все : void QByteArray::clear (). Что-то я с первого взгляда не обнаружил этой ф-ции, удивился даже. Нет конечно, все что объявлено между фигурными скобками дохнет после выхода из них.Еще один вопрос. Допустим есть код типа такого: Код: void DoSomething() Название: Re: Запись в бинарник. Отправлено: Primordial от Апрель 22, 2012, 21:05 А такой вопрос. Есть ли в Qt\Qt Creator инструменты для отслеживания утечек памяти?
Название: Re: Запись в бинарник. Отправлено: V1KT0P от Апрель 22, 2012, 21:09 А такой вопрос. Есть ли в Qt\Qt Creator инструменты для отслеживания утечек памяти? Под линуксом можешь Valgrind подключить.Название: Re: Запись в бинарник. Отправлено: navrocky от Апрель 22, 2012, 23:09 +1
Под линуксом valgrind отлично интегрирован в Qt Creator (профайлер и memcheck). Под виндой остается только юзать платные тулзы (AQTime, DevPartner). Вообще под плюсы лучше разработку вести в линуксе (быстрее и удобнее). Название: Re: Запись в бинарник. Отправлено: Primordial от Апрель 22, 2012, 23:19 Я пока WinXP для работы использую. На вирт. машине установлен Debian, который планирую использовать в качестве локального web-сервера, когда руки дойдут. Хотел Ubuntu поставить, но, к сожалению, дистр. не встал на вирт. машину. А какие ключевые особенности и плюсы разработки под c++ в линуксе?
|