crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Прочитать строки в utf8 из бинарного файла, Ищу решение
iddqd
  опции профиля:
сообщение 17.7.2010, 14:50
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 32
Регистрация: 26.11.2009
Пользователь №: 1261

Спасибо сказали: 1 раз(а)




Репутация:   0  


Есть бинарный файл, в котом местами встречаются строки в кодировке utf8, перед каждой такой строкой стоит её длина в виде qint32.

Вот пример:
06000000D098D0BCD18F

06000000 - длина данных с текстом в байтах,
D098D0BCD18F - слово "Имя" в utf8

Пытаюсь читать вот так:
QDataStream in(&file);
...
qint32 labelLen;
in >> labelLen;
qDebug() << "labelLen=" << labelLen;

uint labelSize=labelLen;
char * label = new char [labelLen];
in.readRawData(label, labelSize);

out << label << "\n";


В консоли вижу нечитаемый набор символов и знаков вопросов вместо текста.

Как правильнее реализовать чтение данных в этом случае?

Qt 4.6, Win32
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Алексей1153
  опции профиля:
сообщение 17.7.2010, 17:30
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


А инициализировать то кто будет?

char * label = new char [labelLen];
memset(label,0,sizeof(*label)*labelLen);//<<<<<<<<

в общем, строка у тебя нулём не оканчивалась. Ещё полезно после заполнения массива (у тебя из in.readRawData) ставить принудительно ноль в конец массива
label[labelLen-1]=0;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iddqd
  опции профиля:
сообщение 17.7.2010, 18:50
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 32
Регистрация: 26.11.2009
Пользователь №: 1261

Спасибо сказали: 1 раз(а)




Репутация:   0  


Строка не оканчивалась нулем, проверил неоднократно.

Ваш вариант тоже работает корректно, спс.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- iddqd   Прочитать строки в utf8 из бинарного файла   17.7.2010, 14:50
- - DIMEDROLL   для начала попробуй так: out << QString...   17.7.2010, 15:32
|- - iddqd   Вот этот вариант out << QString::f...   17.7.2010, 15:41
|- - DIMEDROLL   подозреваю что ты неправильно считываешь размер ст...   17.7.2010, 15:51
|- - iddqd   labelLen после считывания равен 6. И 6 байт (по 2 ...   17.7.2010, 15:54
|- - iddqd   Разобрался. Надо было явно указать размер данных. ...   17.7.2010, 17:06
- - Алексей1153   А инициализировать то кто будет? char * label = n...   17.7.2010, 17:30
|- - iddqd   Строка не оканчивалась нулем, проверил неоднократн...   17.7.2010, 18:50
- - Алексей1153   Цитата(iddqd @ 17.7.2010, 21:50) вариант ...   17.7.2010, 20:08
|- - iddqd   Строка нулём не оканчивалась. Вот пример данных: Ц...   17.7.2010, 20:43
- - Litkevich Yuriy   для этих целей в Qt есть класс QByteArray - низкоу...   17.7.2010, 22:14
- - DEADHUNT   зачем что-то мудрить когда достаточно дописать код...   17.7.2010, 22:16
- - Алексей1153   а лучше так std::vector<char> labe...   18.7.2010, 6:00
- - DEADHUNT   Цитата(Алексей1153 @ 18.7.2010, 7:00) lab...   18.7.2010, 11:21
- - Алексей1153   DEADHUNT, зато надёжно. А на скорости это не скаже...   18.7.2010, 14:54
- - DEADHUNT   Цитата(Алексей1153 @ 18.7.2010, 15:54) DE...   18.7.2010, 15:11
- - Алексей1153   DEADHUNT, тут код очень маленький и запутаться про...   18.7.2010, 15:58
- - DEADHUNT   Цитата(Алексей1153 @ 18.7.2010, 16:58) st...   18.7.2010, 16:40
- - Алексей1153   DEADHUNT, для меня это одно и то же. Кстати, ещё н...   18.7.2010, 17:41
- - iddqd   Видимо из-за произошедшего сбоя потерялась часть с...   28.7.2010, 18:53
- - BRE   Цитата(iddqd @ 28.7.2010, 19:53) Видимо и...   28.7.2010, 20:28
- - iddqd   Цитата(BRE @ 28.7.2010, 21:28) Тему разде...   28.7.2010, 20:33


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2024, 15:10