crossplatform.ru

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

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Прочитать строки в utf8 из бинарного файла, Ищу решение
Litkevich Yuriy
  опции профиля:
сообщение 17.7.2010, 22:14
Сообщение #11


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


для этих целей в Qt есть класс QByteArray - низкоуровневая строка, которая возвращая значение подставляет нуль в конце.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 17.7.2010, 22:16
Сообщение #12


Активный участник
***

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

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




Репутация:   2  


зачем что-то мудрить когда достаточно дописать код:
QDataStream in(&file);
...
qint32 labelLen;
in >> labelLen;
qDebug() << "labelLen=" << labelLen;

uint labelSize=labelLen;
char * label = new char [labelLen + 1];
in.readRawData(label, labelSize);
label[labelLen] = '\0';

out << label << "\n";
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.7.2010, 6:00
Сообщение #13


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

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

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




Репутация:   34  


а лучше так
std::vector<char> label(labelLen+1,0);
in.readRawData(&label[0],label.size()-1);
label[label.size()-1] = '\0';

out << &label[0] << "\n";


и не забудешь delete вызвать


Сообщение отредактировал Алексей1153 - 18.7.2010, 6:07
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 18.7.2010, 11:21
Сообщение #14


Активный участник
***

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

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




Репутация:   2  


Цитата(Алексей1153 @ 18.7.2010, 7:00) *
label[label.size()-1] = '\0';

бесполезно, т. к. ты уже инициализировал вектор нулями.

Сообщение отредактировал DEADHUNT - 18.7.2010, 11:22
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.7.2010, 14:54
Сообщение #15


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

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

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




Репутация:   34  


DEADHUNT, зато надёжно. А на скорости это не скажется
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 18.7.2010, 15:11
Сообщение #16


Активный участник
***

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

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




Репутация:   2  


Цитата(Алексей1153 @ 18.7.2010, 15:54) *
DEADHUNT, зато надёжно. А на скорости это не скажется

что значит надёжно, ты считаешь тот код не детерминированным? при конструировании вектора ты задаёшь его длину и начальные значения.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.7.2010, 15:58
Сообщение #17


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

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

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




Репутация:   34  


DEADHUNT, тут код очень маленький и запутаться просто негде. Но, что бы там не было наколбашено, обеспечиваем, что строка заканчивается на zero-terminator. Вот другой пример:

std::vector<char> label(labelLen+1,0);
in.readRawData(label);//функция принимает вектор по ссылке, к примеру
//понадеялись на совесть функции//label[label.size()-1] = '\0';
out << &label[0] << "\n";//программа сдохла

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 18.7.2010, 16:40
Сообщение #18


Активный участник
***

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

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




Репутация:   2  


Цитата(Алексей1153 @ 18.7.2010, 16:58) *
std::vector<char> label(labelLen+1,0);
in.readRawData(label);//функция принимает вектор по ссылке, к примеру
//понадеялись на совесть функции//label[label.size()-1] = '\0';
out << &label[0] << "\n";//программа сдохла

то есть readRawData считает >= labelLen+1? вообще здесь лучше просто string использовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.7.2010, 17:41
Сообщение #19


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

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

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




Репутация:   34  


DEADHUNT, для меня это одно и то же. Кстати, ещё ни разу не приходилось std::string применять :)

А в этом примере я условился, что принимается по ссылке именно вектор.

Это вообще дело вкуса и граблей за плечами (так как я немного рассеянный, я всячески себя подстраховываю)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iddqd
  опции профиля:
сообщение 28.7.2010, 18:53
Сообщение #20


Студент
*

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

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




Репутация:   0  


Видимо из-за произошедшего сбоя потерялась часть сообщений в теме. Я попытался восстановить по имеющимся уведомлениям об ответах:

maint
Цитата
Цитата
Цитата(iddqd @ 20.7.2010, 15:36) Есть дата, хранящаяся в микросекундах в виде int64.
Как правильнее и быстрее преобразовать её в QDate/QDateTime ?
Пробовал QDateTime::addMSecs(), не это не то, так как результат в дебаггере показывает 1531 год :blink:

по моему так
void QDateTime::setTime_t ( uint seconds )
Sets the date and time given the number of seconds that have passed since 1970-01-01T00:00:00, Coordinated Universal Time (Qt::UTC). On systems that do not support time zones this function will behave as if local time were Qt::UTC.



Litkevich Yuriy
Цитата
iddqd, возможно дата в Unix-формате, тогда используй:
http://doc.crossplatform.ru/qt/4.5.0/qdate...html#fromTime_t (QDateTime QDateTime::fromTime_t ( uint seconds ) [static])
ну а из него уже получишь только дату


iddqd
Цитата
Дата может быть как до 1970, так и после 1970 года.


SABROG
Цитата
Цитата
Цитата(iddqd @ 21.7.2010, 17:01)
SABROG, год должен получиться 1960-й

Правильно, чуток не верно посчитал:

61855747200000000 / 1000 = 61855747200000 // переводим в миллисекунды
61855747200000 / 1000 = 61855747200 // переводим в секунды

365.2424 * 24 * 60 * 60 = 31556943.36 // вычисляем количество секунд в году Грегорианского календаря

61855747200 / 31556943.36 = 1960.1 // получаем количество лет
4,13821440 - остаток 4 секунды.

То есть судя по маленькому остатку у тебя в базе почти ровная дата 01-01-1960 00:00:04


---

Дата должна получиться следующая - 06.02.1960
Вопрос остаётся открытым, декодировать так и не получилось пока что...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




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