crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Чтение двоичных файлов
AD
  опции профиля:
сообщение 8.7.2008, 12:20
Сообщение #1


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Ну задачка в принципе уже решена, но это сделано с помощью WinApi функций, таких как
::ReadFile()
А теперь хочу решить ее с помощью QDataStream. Подскажите, пожалуйста, как правильно скачать в свои структуры из файла! Подскажите, пожалуйста, как это в коде сделать?
Мои предположения: эту иою структуру (обзовем ее T) занести в QVector и потом сделать: QVector<T*> vecT;
QDataStream in(file);
in >> vecT;

правильная мысль? Или надо по-другому?

Сообщение отредактировал AD - 8.7.2008, 13:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sploid
  опции профиля:
сообщение 8.7.2008, 12:54
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 51
Регистрация: 26.2.2008
Из: Москва
Пользователь №: 106

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




Репутация:   1  


тогда уж так:
QVector< T > vectT;
QDataStream in(file);
in << vectT;

вектор умеет сохранять себя, для этого нужно что бы элементы вектора тоже умели себя сохранять.
в доке это написано:
http://doc.trolltech.com/4.4/qvector.html
в разделе "Related Non-Members"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 8.7.2008, 19:16
Сообщение #3


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Помогите пожалуйста, я немного запутался.
Вот структура, которую я пытаюсь считать из файла
struct MAC4Header
{
    enum {
        SIGN_SIZE = 16,
        LIB_IDENT_SIZE = 256 - SIGN_SIZE - 2 * sizeof(int) };
    enum {
        CUR_VERSION_MAJOR = 1,
        CUR_VERSION_MINOR = 0,
         };
    char  Signature[ SIGN_SIZE ];
    char  LibraryIdent[ LIB_IDENT_SIZE ];
    int   VersionMajor;
    int   VersionMinor;

    float Latb;
    float Late;
    float Lonb;
    float Lone;

    unsigned int Year;
    unsigned int Month;
    unsigned int Day;
    unsigned int Hour;
    unsigned int Min;
    unsigned int Sec;
    unsigned int Milliseconds;

    unsigned long Crc32;

    unsigned int ChartNumber;
    unsigned int SumSize;
};


Вот так я переопределил оператор operator>>
QDataStream& operator>>(QDataStream& in, MAC4Header& lib_head)
    {
        QString libIdent;
        int _crc = 0;
        in >> libIdent;
        string libIdentificator = libIdent.toStdString();
        strcpy(lib_head.LibraryIdent, libIdentificator.c_str());
        in >> lib_head.VersionMajor >> lib_head.VersionMinor >> lib_head.Latb >> lib_head.Late >> lib_head.Lonb;
        in >> lib_head.Lone >> lib_head.Year >> lib_head.Month >> lib_head.Day >> lib_head.Hour >> lib_head.Min;
        in >> lib_head.Sec >> lib_head.Milliseconds >> lib_head.ChartNumber >> lib_head.SumSize >> _crc;
        lib_head.Crc32 = _crc;

        return in;
    }


Вот само считывание
bool LibReader::TRead()
    {
        bool ret = false;
        if(!open()) return ret;

        QDataStream in(file);
        int v = in.version();

        QVector<MAC4Header> libVec(1, MAC4Header());
        int size = libVec.size();
        in >> libVec;
        //libHeader = vecLib.front();
        
        /*QVector<MAC4Header*> libHeader(1);
        QVector<MAC4ChartHeader*> chartHeader;

        in >> libHeader;*/

        shutdown();
        return ret;
    }


Ну и на всякий случай привожу код LibReader:
/// Класс для чтения библиотек карт
    class LibReader
    {
    private:
        QFile* file;                                ///< файл для чтения библиотек карт
    public:
        LibReader(const QString fileName): file(new QFile(fileName)) {}
        ~LibReader() { delete file; }
        bool open() { if(isOpen()) shutdown(); file -> open(QIODevice::ReadOnly); return isOpen(); }
        bool isOpen() { return file -> isOpen(); }
        void setFilename(const QString fileName) { if(isOpen()) shutdown(); file -> setFileName(fileName); }
        void shutdown() { file -> close(); }
        bool exists() const { return file -> exists(); }
        bool TRead();
        bool loadCharts();
    };


А вопрос вот в чем. Он при чтении вектора выдает бешеный размер и в итоге крутится внутри этого цикла (залез дебаггером и посмотрел)!
Как считать все-таки правильно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 9.7.2008, 9:37
Сообщение #4


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Кто знает правильное решение, поскажите, пожалуйста?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 9.7.2008, 10:19
Сообщение #5


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


А как ты записываешь вектор в файл?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 9.7.2008, 11:21
Сообщение #6


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(ViGOur @ 9.7.2008, 11:19) *
А как ты записываешь вектор в файл?

Вообще файл уже готовый.
Простейший пример создал и то не работает. Вот код. Где ошибка, в душе не знаю:
struct _str 
{
    int y;
    QString s;
    double n;
    _str(): y(100), s("Hello, Kelly!"), n(0.9652) {}
};
QDataStream& operator>>(QDataStream& in, _str& ls);
QDataStream& operator<<(QDataStream& out, const _str& ls);


QDataStream& operator>>(QDataStream& in, _str& ls)
{
    in >> ls.y >> ls.s >> ls.n;
    return in;
}

QDataStream& operator<<(QDataStream& out, const _str& ls)
{
    out << ls.y << ls.s << ls.n;
    return out;
}

А далее в функции делаю следующее:

QFile fl("nt.dat");
fl.open(QIODevice::WriteOnly);
_str un;
QDataStream out(&fl);
out << un;
fl.close();

un.s = "YYY";
un.n = -0.18;
un.y = 1;

QFile fl1("nt.dat");
fl1.open(QIODevice::ReadOnly);
QDataStream in(&fl);
in >> un;
fl.close();


Пишет правильно, а вот считывает ахинею!

Сделал в приведенном примере кое-какие поправки: стал записывать и считывать через вектор. Записывает он правильно, но в начале плюс ко всему пишет и размер вектора (вот поэтому у меня происходит зацикливание - нет указания на размер вектора). А вот при считывании все-равно в вектор ахинею пишет. Вот код:
_str un;
QVector<_str> unv;
unv.push_back(un);

QFile fl("nt.dat");
fl.open(QIODevice::WriteOnly);
QDataStream out(&fl);
out << unv;
fl.close();

unv[0].y = 1;
unv[0].s = "Hi";
unv[0].n = 1.3;

QFile fl1("nt.dat");
fl1.open(QIODevice::ReadOnly);
QDataStream in(&fl);
in >> unv;
fl.close();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 9.7.2008, 12:40
Сообщение #7





Гости








    


Возможно баг.
Я вообще не могу найти реализации чтения QVector.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 9.7.2008, 13:04
Сообщение #8


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(Гость @ 9.7.2008, 13:40) *
Возможно баг.
Я вообще не могу найти реализации чтения QVector.

C тестовым примером разобрался. А вот со своим еще нет.
Ошибка в тестовом примере была вот в этой строчке:
QDataStream in(&fl);

А надо
QDataStream in(&fl1);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 9.7.2008, 13:05
Сообщение #9


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Копи-пасте вредно для здоровья! ;)
Попробуй так:
QFile fl("nt.dat");
fl.open(QIODevice::WriteOnly);
_str un;
QDataStream out(&fl);
out << un;
fl.close();

un.s = "YYY";
un.n = -0.18;
un.y = 1;

QFile fl1("nt.dat");
fl1.open(QIODevice::ReadOnly);
QDataStream in(&fl1);
in >> un;
fl1.close();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 9.7.2008, 13:09
Сообщение #10


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(ViGOur @ 9.7.2008, 14:05) *
Копи-пасте вредно для здоровья! ;)
Попробуй так:
QFile fl("nt.dat");
fl.open(QIODevice::WriteOnly);
_str un;
QDataStream out(&fl);
out << un;
fl.close();

un.s = "YYY";
un.n = -0.18;
un.y = 1;

QFile fl1("nt.dat");
fl1.open(QIODevice::ReadOnly);
QDataStream in(&fl1);
in >> un;
fl1.close();

Уже пробовал. Тоже работает. НО ЭТО ВСЕ В ТЕСТЕ! А вот мою библиотеку картографическую, не хочет читать!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 26.11.2022, 22:16