Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Как заполнить свободные ячейки массива? |
Автор: graham 23.10.2009, 20:59 |
Нужно собрать бинарный файл с заданной структурой. Идет сначала 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 23.10.2009, 22:36 |
Чем QDataStream не угодил? |
Автор: graham 24.10.2009, 09:42 | ||
Сасибо, еще раз пролистал документацию по QDataStream, угодил ![]() Не увидел в нем сразу writeBytes, который позволяет дополнить нулями, писал через оператор <<. Но всеравно сейчас получаю не тот результат, который надо. делаю вот как:
Запись числа в файле получается 00 00 01 90, а надо 90 01 00 00 (так было когда писал это же в студии на С++\ANSI). После записи массива czString, в файле получаю перед "My string" еще 4 байта, в которых, я так понял, записывается число количество записанных символов = 64 (00 00 00 40). Может есть какая-то зависимость от компилятора, пишу в Windows, пока с QT только разбираюсь. |
Автор: SABROG 24.10.2009, 10:16 |
А откуда появилась необходимость писать строки именно в определенном формате? Никакие Си строки и qstrcpy не нужны, чтобы отправить QString в датастрим. |
Автор: graham 24.10.2009, 11:00 |
Объясните, пожалуйста, что Вы имеете ввиду. Если правильно понял, то нет необходимости использовать чистый Си. Но как отправить записать через QDataStream строку QString str = "test string.", так, чтобы в файле бинарном получилось поле в 44 байт, в начале которого будет ASCII код "test string." а остальные байты будут заполнены нулями. Т.е. я не нашел простого способа дополнить строку до 44 символов. |
Автор: graham 25.10.2009, 20:30 | ||||
Может я не так что-то объяснил. До этого то же самое писал на голом Си. Открывал файл:
писал в него:
Как то же самое сделать в QT? В общем-то уже разобрался с текстовым полем. Определил его через char chTemp[44], поместил в него текст через qstrcpy(). Записал его в файл через file.write(chTemp, 44). Но число "правильно" записать таким же образом не удалось. Число определяю в QT как quint32. Пробовал писать через перенаправление в поток <<, получаю не в той очередности расставленные байты. Записать через file.write не получилось, т.к. не смог привести qint32 к char*. Попытки привести к char* чтобы напечатать в файл используя file.write через int::itoa и (char*) приводят к эксепшену во время исполнения кода. Хотел использовать fwrite от Си, не нашел как :( |
Автор: SABROG 25.10.2009, 21:32 |
Попробую и я объяснить. QDataStream позволяет сделать сериализацию данных, при этом не нужно думать о формате файла в котором эти данные будут находится. Числовые типы записываются в переносимом формате, т.е. нет необходимости думать о BigEndians/LittleEndians. Если требуется "сгенерить" файл определенной структуры, где все размерности и расположение данных контролирует сам разработчик, и потом использовать полученный файл в других программах, которые не написаны с использованием Qt, то правильней будет перенести рабочий код из Си в новую программу. QDataStream скорее для тех, кто хочет записывать и получать типы данных не думая о внутренней реализации их хранения. |
Автор: graham 25.10.2009, 22:11 |
О... уже прояснения, оказывается я три дня убил на поиск того, чего нет ![]() SABROG, объясните пожалуйста поподробнее что это значит:"то правильней будет перенести рабочий код из Си в новую программу". В коде QT использовать вставку на Cи или смысл фразы другой? |
Автор: SABROG 25.10.2009, 22:39 |
Переписать на C++, возможно с использованием STL. Но ты так и не ответил на мой вопрос, который я задал уже два раза (этот третий). |
Автор: graham 25.10.2009, 22:52 |
На вопрос "Чем QDataStream не угодил?"? Я же объяснил, мне нужен определенноый формат данных в бинарном файле. У меня не получается получить его с помощью QDataStream. В принципе какая мне разница на чем реализовать, раз не получается из QDataStream записать так, как мне надо, придется на С++. |
Автор: graham 25.10.2009, 23:06 |
Привязка к другому программному продукту. Добавлено через 5 минут и 53 секунды В общем решил все это дело подключением <iostream> и написанием на чистом Си. Что-же я раньше не допер :( |