Чтение структуры из двоичного файла в 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(¶m, 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(¶m, 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(¶m, 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;
}