Russian Qt Forum
Ноябрь 24, 2024, 16:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Считывание пользовательского типа из файла  (Прочитано 6567 раз)
merke
Гость
« : Сентябрь 25, 2009, 16:26 »

Всем привет!
Столкнулся с проблемой. Я на Visual Basic созжаю переменую пользовательского типа допустим с тремя элементами каждый из которых имеет тип String. Теперь данную струкруту я заполняю данными и записываю её в бинарный файл. Теперь средствами QT пытаюсь считать данную структуру из файла. Т.е. создаю такой же пользовательский тип к примеру:

Код:
struct mytype
{
 QString name;
 QString fam;
 QString age;
};
mytype type;

Далее открываю файл в бинарном режиме и считываю струкруту.


Код:
    QFile infile1("C:\\dt1.dat");
    infile1.open(QIODevice::ReadOnly);
    QDataStream stream1(&infile1);
    stream1 >> type;
    qDebug() << type.name << type.fam<< type.man;

Для того чтобы считать структуру я перегружаю операторы << и >>

Код:
   friend QDataStream &operator<<(QDataStream & ds,  myst &calData)
        {
           ds << calData.name << calData.fam << calData.age;
           return ds;
        }
    friend QDataStream &operator>>(QDataStream & ds, myst &calData)
        {
           ds << calData.name << calData.fam << calData.age;
           return ds;
        }

Но после считывания я получаю пустые строки, т.е. ни чего не считывается.
Помогите пожалуйста разобраться с данной проблемой. Или объясните почему данное нельзя реализовать.
Записан
SimpleSunny
Гость
« Ответ #1 : Сентябрь 25, 2009, 18:18 »

Код
C++ (Qt)
Ваш вариант.
       friend QDataStream &operator>>(QDataStream & ds, myst &calData)
       {
          ds << calData.name << calData.fam << calData.age;
          return ds;
       }
 
ИСправить опечатку.
ds >> calData.name >> calData.fam >> calData.age;
 
 
Записан
BRE
Гость
« Ответ #2 : Сентябрь 25, 2009, 18:25 »

Тут бы еще посмотреть как оно в Basic'е строки записывает, в какой кодировке.
Записан
SLiDER
Гость
« Ответ #3 : Сентябрь 25, 2009, 19:46 »

Эммммм, в документации как бы написано: "Each item written to the stream is written in a predefined binary format that varies depending on the item's type". Вы абсолютно уверены что в своей программе на Visual Basic  совершенно точно воспроизвели этот самый формат который QDataStream ожидает увидеть при попытке прочитать QString, судя по тому что вы написали - нет.
Записан
crackedmind
Гость
« Ответ #4 : Сентябрь 26, 2009, 13:32 »

При использовании QDataStream, QString записывается ввиде: 4 байта длина строки, затем сама строка идет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Сентябрь 26, 2009, 13:39 »

При использовании QDataStream, QString записывается ввиде: 4 байта длина строки, затем сама строка идет.
А так ли это на Ваське? Сначала надо пописАть строки здесь и там и файлы сравнить.
Записан
merke
Гость
« Ответ #6 : Сентябрь 26, 2009, 15:44 »

Спасибо! Вот например если я на бэйсике записываю структуру состоящую из трёх элементов и каждый имеет тип Integer. Всё это дело заполняю данными и записываю в бинарник. Теперь в Кутищище создаю точно такую же структуру тока элементы имеют тип quint16 так как бэйсиковский Integer имеет размер 2 байта. Теперь я считываю файлик. Считать получается, только вот в переменные записаны не сами числа, а их байтовое представление, например записал на бэйсике 1 в Qt получил 256, думаю понятно)))
Как мне теперь преобразовать всё это дело?
Записан
SLiDER
Гость
« Ответ #7 : Сентябрь 26, 2009, 21:45 »

Цитировать
только вот в переменные записаны не сами числа, а их байтовое представление, например записал на бэйсике 1 в Qt получил 256, думаю понятно)))

Нет, непонятно.  Непонимающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Сентябрь 27, 2009, 11:44 »

Считать получается, только вот в переменные записаны не сами числа, а их байтовое представление, например записал на бэйсике 1 в Qt получил 256, думаю понятно)))
Как мне теперь преобразовать всё это дело?
Судя по тому что Вы рассказываете, данные записаны в BIG_ENDIAN.
Попробуйте QDataStream::setByteOrder(QDataStream::BigEndian);

Edit: посмотрел Assistant, там сказано что BigEndian по default (все правильно, по классике). Значит пробуйте QDataStream::LittleEndian, короче: запись и чтение должны быть в одном Endian
« Последнее редактирование: Сентябрь 27, 2009, 15:10 от Igors » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.162 секунд. Запросов: 22.