![]() |
|
![]() ![]() ![]() |
|
graham |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
Нужно собрать бинарный файл с заданной структурой.
Идет сначала 10 байт, потом 44, потом 1.. и т.д. Потом повторяется. Надо собирать данные и записывать в бинарный файл, если лишние ячейки будут, то заполнять нулями. Структуру забил в класс. Поля больше 1 байта определил как QByteArray. Не получается неполностью занятые поля записать в файл так, чтобы поле занимало все свое место. К примеру первое поле, которое 10 байт, заполняю текстом "text" получается 4 символа + \0. Чтобы увеличить размер до 10 вызываю resize(10). После записи в массиве после "text" лежит мусор, но не нули. Как сделать чтобы было заполнено именно нулями? Пробовал fill(0x00), потом prepend("text"). Нужного результа так и не получил. Пробовал массив задать через обычное объявление: char string[], потом туда добавить текст через qstrcpy, тогда после текста "\0" и не знаю как его передвинуть в конец массива, чтобы при записи записалось 10 байт, а не 4. Подскажите, как можно забить пустые ячейки нулями, или где это описано, вроде уже всю документацию по QT просмотрел на нужную тематику. |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Чем QDataStream не угодил?
|
|||
|
||||
graham |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
Сасибо, еще раз пролистал документацию по QDataStream, угодил
![]() Не увидел в нем сразу writeBytes, который позволяет дополнить нулями, писал через оператор <<. Но всеравно сейчас получаю не тот результат, который надо. делаю вот как:
Запись числа в файле получается 00 00 01 90, а надо 90 01 00 00 (так было когда писал это же в студии на С++\ANSI). После записи массива czString, в файле получаю перед "My string" еще 4 байта, в которых, я так понял, записывается число количество записанных символов = 64 (00 00 00 40). Может есть какая-то зависимость от компилятора, пишу в Windows, пока с QT только разбираюсь. |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
А откуда появилась необходимость писать строки именно в определенном формате? Никакие Си строки и qstrcpy не нужны, чтобы отправить QString в датастрим.
|
|||
|
||||
graham |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
Объясните, пожалуйста, что Вы имеете ввиду. Если правильно понял, то нет необходимости использовать чистый Си.
Но как отправить записать через QDataStream строку QString str = "test string.", так, чтобы в файле бинарном получилось поле в 44 байт, в начале которого будет ASCII код "test string." а остальные байты будут заполнены нулями. Т.е. я не нашел простого способа дополнить строку до 44 символов. Это сообщение отредактировал(а) graham - 24.10.2009, 11:02 |
|||
|
||||
graham |
|
||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
Может я не так что-то объяснил.
До этого то же самое писал на голом Си. Открывал файл:
писал в него:
Как то же самое сделать в QT? В общем-то уже разобрался с текстовым полем. Определил его через char chTemp[44], поместил в него текст через qstrcpy(). Записал его в файл через file.write(chTemp, 44). Но число "правильно" записать таким же образом не удалось. Число определяю в QT как quint32. Пробовал писать через перенаправление в поток <<, получаю не в той очередности расставленные байты. Записать через file.write не получилось, т.к. не смог привести qint32 к char*. Попытки привести к char* чтобы напечатать в файл используя file.write через int::itoa и (char*) приводят к эксепшену во время исполнения кода. Хотел использовать fwrite от Си, не нашел как :( |
||||
|
|||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Попробую и я объяснить. QDataStream позволяет сделать сериализацию данных, при этом не нужно думать о формате файла в котором эти данные будут находится. Числовые типы записываются в переносимом формате, т.е. нет необходимости думать о BigEndians/LittleEndians.
Если требуется "сгенерить" файл определенной структуры, где все размерности и расположение данных контролирует сам разработчик, и потом использовать полученный файл в других программах, которые не написаны с использованием Qt, то правильней будет перенести рабочий код из Си в новую программу. QDataStream скорее для тех, кто хочет записывать и получать типы данных не думая о внутренней реализации их хранения. |
|||
|
||||
graham |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
О... уже прояснения, оказывается я три дня убил на поиск того, чего нет
![]() SABROG, объясните пожалуйста поподробнее что это значит:"то правильней будет перенести рабочий код из Си в новую программу". В коде QT использовать вставку на Cи или смысл фразы другой? |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Переписать на C++, возможно с использованием STL. Но ты так и не ответил на мой вопрос, который я задал уже два раза (этот третий). Это сообщение отредактировал(а) SABROG - 25.10.2009, 22:39 |
|||
|
||||
graham |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
На вопрос "Чем QDataStream не угодил?"?
Я же объяснил, мне нужен определенноый формат данных в бинарном файле. У меня не получается получить его с помощью QDataStream. В принципе какая мне разница на чем реализовать, раз не получается из QDataStream записать так, как мне надо, придется на С++. Это сообщение отредактировал(а) graham - 25.10.2009, 22:52 |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
||||
|
||||
graham |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
Привязка к другому программному продукту.
Добавлено через 5 минут и 53 секунды В общем решил все это дело подключением <iostream> и написанием на чистом Си. Что-же я раньше не допер :( |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |