Solved Using QDataStream with an updating file
-
I am writing a tool that will parse a binary recording file real-time. I was planning on using QDataStream for this purpose. The intention is to open the file and initially parse as much of the file as is currently available, and then set a timer, to periodically read whatever was recorded in the interim. My question is, if I leave data in the stream and the file is written to in the meantime, will the QDataStream update to reflect the current state of the file, in particular bytesAvailable when I next query it?
-
Depends if the QIODevice does that, if you are using QFile it should be fine
-
@VRonin yes, the QIODevice is a QFile
-
#include <QApplication> #include <QTimer> #include <QFile> #include <QDataStream> #include <QTime> #include <QDebug> int main(int argc, char* argv[]) { QApplication a(argc, argv); QFile readFile("test.dat"); QFile writeFile("test.dat"); if (!writeFile.open(QIODevice::WriteOnly)) Q_ASSERT(false); if (!readFile.open(QIODevice::ReadOnly)) Q_ASSERT(false); QDataStream readStream(&readFile); QDataStream writeStream(&writeFile); QTimer writeTimer; writeTimer.setInterval(3000); QTimer readTimer; readTimer.setInterval(500); readTimer.setSingleShot(true); QObject::connect(&writeTimer, &QTimer::timeout, [&writeStream, &readTimer]()->void { const QTime currTime = QTime::currentTime(); qDebug() << "Saving: " << currTime; writeStream << currTime; qDebug() << "bytesAvailable: " << writeStream.device()->bytesAvailable(); readTimer.start(); }); QObject::connect(&readTimer, &QTimer::timeout, [&readStream]()->void { qDebug() << "bytesAvailable: " << readStream.device()->bytesAvailable(); QTime currTime; readStream >> currTime; qDebug() << "Loading: " << currTime; }); QTimer::singleShot(0, &writeTimer, SLOT(start())); QTimer::singleShot(10000, &writeTimer, SLOT(stop())); return a.exec(); }
-
@VRonin Thanks... that's exactly what I was hoping for!