Чтение структуры из двоичного файла в Qt

Имеется программа, записывающая данные (структуру) в файл, содержащую время (float) и этап (int), энное кол-во раз.

Мне нужно этот файл корректно прочитать и брать переменные.

Для начала хочу вывести на консоль, но не пойму как это можно сделать:

#include <QCoreApplication>
#include <QDebug>
#include <QFile>
#include <QDataStream>
#include <qstring.h>
#include <sys/stat.h>
#include <memory.h>
#include <fcntl.h>
#include <stdio.h>


struct message {
    float duration; // время
    int step;       // этап
}__attribute__((packed));


void read()
{
    message param;
    QFile file("qttest");
    QDataStream output(&file);
    if( file.open(QIODevice::ReadOnly) )
    {
        // output>>param.duration>>param.step;
        qDebug() <<param.duration<<param.step;
        file.close();
    }
}

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    read();

    return app.exec();
} 

Простой пример реализации без Qt создания файла:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

struct Message {
    float duration = 1.245;//время
    int step = 3; //этап
}__attribute__((packed));
    
Message param;

int main() {

    FILE* file = fopen("testbin1", "ab");
    fwrite(&param, sizeof(param), 1, file);
    cout << "время: " << param.duration << endl << "этап: " << param.step << endl;
    fclose(file);
        
    return 0;
}

и чтение:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

struct message {
    float duration; //время
    int step;       //этап  
}_attribute__((packed));

int main(){
    
    message param;
    
    FILE* file = fopen("testbin1", "rb");
    fread(&param, sizeof(param),1,file);

    cout  
    << "time: " << param.duration << endl
    << "этап: " << param.step << endl;

    fclose(file);

    return 0;
}

Именно так хочу сделать, но с использованием решений на Qt.


Ответы (1 шт):

Автор решения: Alexander Chernin

При помощи QDataStream:: readRawData:

#include <QFile>
#include <QDebug>
#include <iostream>

using namespace std;

struct Message {
    float duration = 1.324; // время
    int step = 3;           // этап
} __attribute__((packed));

// Выводим сообщение в qDebug()
QDebug operator << (QDebug& debug, const Message& m) {
    debug.space() << m.duration << m.step;
    return debug;
}

// Читаем сообщение из потока
QDataStream& operator >>(QDataStream& stream, Message& m) {
    stream.readRawData((char*)&m.duration, sizeof (float));
    stream.readRawData((char*)&m.step, sizeof (int));
    return stream;
}

int main(int argc, char *argv[])
{
    // Создаем файл и наполняем данными "дедовским" способом
    const char* filename = "testbin1.dat";
    FILE* file = fopen(filename, "w");
    fwrite(&param, sizeof(param), 1, file);
    fclose(file);

    // Читаем в Qt
    QFile readFile(filename);
    QDataStream in(&readFile);
    if (readFile.open(QIODevice::ReadOnly)) {
        Message message;

        // Читаем сообщение из потока
        in >> message;       // смотри operator >> (QDataStream& in, Message& m) выше
        // Выводим результат
        qDebug() << message; // смотри operator >> (QDebug& in, Message& m) выше

        readFile.close();
    }

    return 0;
}
→ Ссылка