Russian Qt Forum

Qt => Общие вопросы => Тема начата: burunduk от Декабрь 12, 2007, 02:01



Название: Запись произвольных двоичных файлов
Отправлено: burunduk от Декабрь 12, 2007, 02:01
Нужно записать двоичный файл подобного формата:

Поле1 LONG
Поле2 DWORD
Поле3 BYTE[4]

Вроде просто дальше некуда, но вот как средствами Qt сделать я не знаю...   Или нужно сходить на свежий воздух  ???
QDataStream не помогает, так как он вставляет в начало служебную информацию, ну и подозреваю не только в начало.



Название: Re: Запись произвольных двоичных файлов
Отправлено: pastor от Декабрь 12, 2007, 02:05
Цитировать
qint64 QIODevice::write ( const char * data, qint64 maxSize )
qint64 QIODevice::writeData ( const char * data, qint64 maxSize ) 


Это должно помочь


Название: Re: Запись произвольных двоичных файлов
Отправлено: Mikhail от Декабрь 12, 2007, 20:57
Нужно записать двоичный файл подобного формата:

Поле1 LONG
Поле2 DWORD
Поле3 BYTE[4]

Вроде просто дальше некуда, но вот как средствами Qt сделать я не знаю...   Или нужно сходить на свежий воздух  ???
QDataStream не помогает, так как он вставляет в начало служебную информацию, ну и подозреваю не только в начало.



Батенька, что то Вы заблудились.
Только QDataStream Вам поможет.

Читай Assistant:

QDataStream дает богатый выбор на все случаи жизни:

QDataStream & operator<< ( qint8 i )
QDataStream & operator<< ( bool i )
QDataStream & operator<< ( quint8 i )
QDataStream & operator<< ( quint16 i )
QDataStream & operator<< ( qint16 i )
QDataStream & operator<< ( qint32 i )
QDataStream & operator<< ( quint64 i )
QDataStream & operator<< ( qint64 i )
QDataStream & operator<< ( quint32 i )
QDataStream & operator<< ( float f )
QDataStream & operator<< ( double f )
QDataStream & operator<< ( const char * s )


 и пишет только то что ты хочешь. Никакой служебной информации.
Запишешь два байта и в файле реальо только два байта, и т.д.

Там же и пример:

QFile file("file.xxx");
 file.open(QIODevice::WriteOnly);
 QDataStream out(&file);

 // Write a header with a "magic number" and a version
 out << (quint32)0xA0B0C0D0;
 out << (qint32)123;

Успехов в чтении документации.


Название: Re: Запись произвольных двоичных файлов
Отправлено: burunduk от Декабрь 13, 2007, 01:11
Я просто строки пытался писать, то там в начале DWORD с длиной ставило и в конце 0.
Да, действительно ничего лишнего уже не пишет, а для строк нужно использовать writeRawData()  :-)

А кстати версии для датастрима получается придумали только для представления встроенных Qt-типов, так ?
Именно они меня и натолкнули на подозрения о служебной информации.

P.S. а работать долго всё-таки вредно :-)


Название: Re: Запись произвольных двоичных файлов
Отправлено: Mikhail от Декабрь 13, 2007, 10:11
Я просто строки пытался писать, то там в начале DWORD с длиной ставило и в конце 0.
Да, действительно ничего лишнего уже не пишет, а для строк нужно использовать writeRawData()  :-)

А кстати версии для датастрима получается придумали только для представления встроенных Qt-типов, так ?
Именно они меня и натолкнули на подозрения о служебной информации.

P.S. а работать долго всё-таки вредно :-)

Ну вообще то никаких встроенных собенных Qt типов нет. Это только Qt названия обычных типов в стиле C.
Это упорядочивает их, не так ли?


Название: Re: Запись произвольных двоичных файлов
Отправлено: pastor от Декабрь 13, 2007, 18:37
Ну вообще то никаких встроенных собенных Qt типов нет. Это только Qt названия обычных типов в стиле C.
Это упорядочивает их, не так ли?

На самолм деле QDataStream поддерживает намного большее кол-во чем приведено выше. Каждый тип сохраняеться в своём формате (служебная информация + данные etc). Подробне см. в ассистанте:

Format of the QDataStream Operators (http://doc.trolltech.com/4.3/datastreamformat.html)


Название: Re: Запись произвольных двоичных файлов
Отправлено: Mikhail от Декабрь 14, 2007, 17:12
Ну вообще то никаких встроенных собенных Qt типов нет. Это только Qt названия обычных типов в стиле C.
Это упорядочивает их, не так ли?

На самолм деле QDataStream поддерживает намного большее кол-во чем приведено выше. Каждый тип сохраняеться в своём формате (служебная информация + данные etc). Подробне см. в ассистанте:

Format of the QDataStream Operators (http://doc.trolltech.com/4.3/datastreamformat.html)

Это верно, однако был задан вопрос о сохранении в двоичном файле простых типов и на него был дан полный ответ.