Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Как заполнить свободные ячейки массива? Нужно сформировать бинарный файл. 
V
    Опции темы
graham
Дата 23.10.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 просмотрел на нужную тематику.


PM MAIL   Вверх
SABROG
Дата 23.10.2009, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Чем QDataStream не угодил?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
graham
Дата 24.10.2009, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.4.2009

Репутация: нет
Всего: нет



Сасибо, еще раз пролистал документацию по QDataStream, угодил smile
Не увидел в нем сразу writeBytes, который позволяет дополнить нулями, писал через оператор <<.

Но всеравно сейчас получаю не тот результат, который надо.

делаю вот как:

Код

int iVal = 400;
char czString[64];

qstrcpy(czString, "My string.");

QFile file("TestFile.hex");

if (!file.open(QIODevice::WriteOnly))
         return -1;

QDataStream out(&file);
out <<  iVal;

out.writeBytes(czString, 64);

file.close();



Запись числа в файле получается 00 00 01 90, а надо 90 01 00 00 (так было когда писал это же в студии на С++\ANSI).
После записи массива czString, в файле получаю перед "My string" еще 4 байта, в которых, я так понял, записывается число количество записанных символов =  64  (00 00 00 40).

Может есть какая-то зависимость от компилятора, пишу в Windows, пока с QT только разбираюсь.

PM MAIL   Вверх
SABROG
Дата 24.10.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



А откуда появилась необходимость писать строки именно в определенном формате? Никакие Си строки и qstrcpy не нужны, чтобы отправить QString в датастрим.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
graham
Дата 24.10.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.4.2009

Репутация: нет
Всего: нет



Объясните, пожалуйста, что Вы имеете ввиду. Если правильно понял, то нет необходимости использовать чистый Си.
Но как отправить записать через QDataStream строку QString str = "test string.", так, чтобы в файле бинарном получилось поле в 44 байт, в начале которого будет ASCII код "test string." а остальные байты будут заполнены нулями. Т.е. я не нашел простого способа дополнить строку до 44 символов.

Это сообщение отредактировал(а) graham - 24.10.2009, 11:02
PM MAIL   Вверх
graham
Дата 25.10.2009, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.4.2009

Репутация: нет
Всего: нет



Может я не так что-то объяснил.
До этого то же самое писал на голом Си.

Открывал файл:

Код

fOut  = fopen( fileOut_name, "wb" )


писал в него:

Код

fwrite(&version,sizeof(long int), 1, fOut);
fwrite(&text,sizeof(char), 44, fOut);


Как то же самое сделать в QT?
В общем-то уже разобрался с текстовым полем.
Определил его через char chTemp[44], поместил в него текст через qstrcpy(). Записал его в файл через file.write(chTemp, 44).

Но число "правильно" записать таким же образом не удалось.
Число определяю в QT как quint32.
Пробовал писать через перенаправление в поток <<, получаю не в той очередности расставленные байты.
Записать через file.write не получилось, т.к. не смог привести qint32 к char*.
Попытки привести к char* чтобы напечатать в файл используя file.write через int::itoa и (char*) приводят к эксепшену во время исполнения кода.

Хотел использовать fwrite от Си, не нашел как :(


PM MAIL   Вверх
SABROG
Дата 25.10.2009, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Попробую и я объяснить. QDataStream позволяет сделать сериализацию данных, при этом не нужно думать о формате файла в котором эти данные будут находится. Числовые типы записываются в переносимом формате, т.е. нет необходимости думать о BigEndians/LittleEndians.

Если требуется "сгенерить" файл определенной структуры, где все размерности и расположение данных контролирует сам разработчик, и потом использовать полученный файл в других программах, которые не написаны с использованием Qt, то правильней будет перенести рабочий код из Си в новую программу. QDataStream скорее для тех, кто хочет записывать и получать типы данных не думая о внутренней реализации их хранения.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
graham
Дата 25.10.2009, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.4.2009

Репутация: нет
Всего: нет



О... уже прояснения, оказывается я три дня убил на поиск того, чего нет smile
SABROG, объясните пожалуйста поподробнее что это значит:"то правильней будет перенести рабочий код из Си в новую программу".
В коде QT использовать вставку на Cи или смысл фразы другой? 




PM MAIL   Вверх
SABROG
Дата 25.10.2009, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(graham @  25.10.2009,  22:11 Найти цитируемый пост)
вставку на Cи


Переписать на C++, возможно с использованием STL. Но ты так и не ответил на мой вопрос, который я задал уже два раза (этот третий).

Это сообщение отредактировал(а) SABROG - 25.10.2009, 22:39


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
graham
Дата 25.10.2009, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.4.2009

Репутация: нет
Всего: нет



На вопрос "Чем QDataStream не угодил?"?
Я же объяснил, мне нужен определенноый формат данных в бинарном файле. У меня не получается получить его с помощью QDataStream. В принципе какая мне разница на чем реализовать, раз не получается из QDataStream записать так, как мне надо, придется на С++.

Это сообщение отредактировал(а) graham - 25.10.2009, 22:52
PM MAIL   Вверх
SABROG
Дата 25.10.2009, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(graham @  25.10.2009,  22:52 Найти цитируемый пост)
Я же объяснил


Другой вопрос.

Цитата(SABROG @  24.10.2009,  10:16 Найти цитируемый пост)
А откуда появилась необходимость писать строки именно в определенном формате?


Т.е. зачем тебе дополнять нулями и чтобы цифры были правильно развернуты?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
graham
Дата 25.10.2009, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.4.2009

Репутация: нет
Всего: нет



Привязка к другому программному продукту.

Добавлено через 5 минут и 53 секунды
В общем решил все это дело подключением <iostream> и написанием на чистом Си.
Что-же я раньше не допер :(
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0963 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.