Russian Qt Forum

Qt => Общие вопросы => Тема начата: merke от Сентябрь 25, 2009, 16:26



Название: Считывание пользовательского типа из файла
Отправлено: 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;
        }

Но после считывания я получаю пустые строки, т.е. ни чего не считывается.
Помогите пожалуйста разобраться с данной проблемой. Или объясните почему данное нельзя реализовать.


Название: Re: Считывание пользовательского типа из файла
Отправлено: SimpleSunny от Сентябрь 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;
 
 


Название: Re: Считывание пользовательского типа из файла
Отправлено: BRE от Сентябрь 25, 2009, 18:25
Тут бы еще посмотреть как оно в Basic'е строки записывает, в какой кодировке.


Название: Re: Считывание пользовательского типа из файла
Отправлено: SLiDER от Сентябрь 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, судя по тому что вы написали - нет.


Название: Re: Считывание пользовательского типа из файла
Отправлено: crackedmind от Сентябрь 26, 2009, 13:32
При использовании QDataStream, QString записывается ввиде: 4 байта длина строки, затем сама строка идет.


Название: Re: Считывание пользовательского типа из файла
Отправлено: Igors от Сентябрь 26, 2009, 13:39
При использовании QDataStream, QString записывается ввиде: 4 байта длина строки, затем сама строка идет.
А так ли это на Ваське? Сначала надо пописАть строки здесь и там и файлы сравнить.


Название: Re: Считывание пользовательского типа из файла
Отправлено: merke от Сентябрь 26, 2009, 15:44
Спасибо! Вот например если я на бэйсике записываю структуру состоящую из трёх элементов и каждый имеет тип Integer. Всё это дело заполняю данными и записываю в бинарник. Теперь в Кутищище создаю точно такую же структуру тока элементы имеют тип quint16 так как бэйсиковский Integer имеет размер 2 байта. Теперь я считываю файлик. Считать получается, только вот в переменные записаны не сами числа, а их байтовое представление, например записал на бэйсике 1 в Qt получил 256, думаю понятно)))
Как мне теперь преобразовать всё это дело?


Название: Re: Считывание пользовательского типа из файла
Отправлено: SLiDER от Сентябрь 26, 2009, 21:45
Цитировать
только вот в переменные записаны не сами числа, а их байтовое представление, например записал на бэйсике 1 в Qt получил 256, думаю понятно)))

Нет, непонятно.  ???


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

Edit: посмотрел Assistant, там сказано что BigEndian по default (все правильно, по классике). Значит пробуйте QDataStream::LittleEndian, короче: запись и чтение должны быть в одном Endian