crossplatform.ru

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

> Чтение двоичных файлов
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   Чтение двоичных файлов   8.7.2008, 12:20
- - sploid   тогда уж так: QVector< T > vectT; QDataStr...   8.7.2008, 12:54
|- - AD   Помогите пожалуйста, я немного запутался. Вот стру...   8.7.2008, 19:16
- - AD   Кто знает правильное решение, поскажите, пожалуйст...   9.7.2008, 9:37
- - ViGOur   А как ты записываешь вектор в файл?   9.7.2008, 10:19
|- - AD   Цитата(ViGOur @ 9.7.2008, 11:19) А как ты...   9.7.2008, 11:21
- - Гость   Возможно баг. Я вообще не могу найти реализации чт...   9.7.2008, 12:40
|- - AD   Цитата(Гость @ 9.7.2008, 13:40) Возможно ...   9.7.2008, 13:04
- - ViGOur   Копи-пасте вредно для здоровья! Попробуй так:...   9.7.2008, 13:05
|- - AD   Цитата(ViGOur @ 9.7.2008, 14:05) Копи-пас...   9.7.2008, 13:09
- - ViGOur   Приведи оператор operator<<.   9.7.2008, 13:17
|- - AD   Цитата(ViGOur @ 9.7.2008, 14:17) Приведи ...   9.7.2008, 13:22
- - ViGOur   а кто пишет эту структуру? как я понял не ты, прав...   9.7.2008, 13:42
|- - AD   Цитата(ViGOur @ 9.7.2008, 14:42) а кто пи...   9.7.2008, 14:13
- - ViGOur   А как ты читаешь на MFC? read и write работаю на...   9.7.2008, 14:16
|- - AD   Цитата(ViGOur @ 9.7.2008, 15:16) А как ты...   9.7.2008, 14:40
- - ViGOur   Цитата(AD @ 9.7.2008, 15:40) А что исполь...   9.7.2008, 14:45
|- - AD   Цитата(ViGOur @ 9.7.2008, 15:45) QFile Во...   9.7.2008, 14:58
- - ViGOur   Вот так: _str strIn; QFile f1("nt.dat...   9.7.2008, 15:18
- - void*   может проще для таких структур данных использовать...   9.7.2008, 15:19
- - AD   Цитата(void* @ 9.7.2008, 16:19) может про...   9.7.2008, 15:35


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


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




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