Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Write/read struct to binary file using QDataStream
Forum Updated to NodeBB v4.3 + New Features

Write/read struct to binary file using QDataStream

Scheduled Pinned Locked Moved Solved General and Desktop
13 Posts 7 Posters 4.8k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • ZgemboZ Offline
    ZgemboZ Offline
    Zgembo
    wrote on last edited by
    #1

    Hi all,

    I am trying to figure out how to write simple struct to binary file.
    Structure looks like this:

    typedef struct
    {
    int PatientID;
    QString Name;
    QString LastName;
    } PatientItem_t;

    What I need it to write multiple patient structures to binary file, and read those structures fro the file.

    Can anyone give any suggestions?

    K 1 Reply Last reply
    0
    • ZgemboZ Zgembo

      Hi all,

      I am trying to figure out how to write simple struct to binary file.
      Structure looks like this:

      typedef struct
      {
      int PatientID;
      QString Name;
      QString LastName;
      } PatientItem_t;

      What I need it to write multiple patient structures to binary file, and read those structures fro the file.

      Can anyone give any suggestions?

      K Offline
      K Offline
      koahnig
      wrote on last edited by
      #2

      @Zgembo

      Best is defining some operator<< and operator>> for teh structure like done in here for instance

      Vote the answer(s) that helped you to solve your issue(s)

      1 Reply Last reply
      9
      • dheerendraD Offline
        dheerendraD Offline
        dheerendra
        Qt Champions 2022
        wrote on last edited by
        #3

        @koahnig has already given you good link to work on this. In general structure cannot be directly written/read from file. Structure has to be serealized & then written.

        Dheerendra
        @Community Service
        Certified Qt Specialist
        http://www.pthinks.com

        1 Reply Last reply
        0
        • ZgemboZ Offline
          ZgemboZ Offline
          Zgembo
          wrote on last edited by koahnig
          #4

          I have managed to overload << operator and to write data to binary file, but when I read data from the file I do not get anything.

          QDataStream & operator<<(QDataStream & str, const PatientItem_t & patient)
          {
          	str << patient.PatientID
          		<< patient.Name
          		<< patient.LastName;
          
          	return str;
          }
          
          QDataStream & operator>>(QDataStream & str, PatientItem_t & patient)
          {
          	str >> patient.PatientID
          		>> patient.Name
          		>> patient.LastName;
          	return str;
          }
          
          PatientItem_t readPatient;
          QDataStream readPatientStream(&readPatientExportFile);
          readPatientStream >> readPatient;
          

          [koahnig: code tags added]

          K 1 Reply Last reply
          0
          • ZgemboZ Zgembo

            I have managed to overload << operator and to write data to binary file, but when I read data from the file I do not get anything.

            QDataStream & operator<<(QDataStream & str, const PatientItem_t & patient)
            {
            	str << patient.PatientID
            		<< patient.Name
            		<< patient.LastName;
            
            	return str;
            }
            
            QDataStream & operator>>(QDataStream & str, PatientItem_t & patient)
            {
            	str >> patient.PatientID
            		>> patient.Name
            		>> patient.LastName;
            	return str;
            }
            
            PatientItem_t readPatient;
            QDataStream readPatientStream(&readPatientExportFile);
            readPatientStream >> readPatient;
            

            [koahnig: code tags added]

            K Offline
            K Offline
            koahnig
            wrote on last edited by
            #5

            @Zgembo

            Did you use flush or close the file?

            Vote the answer(s) that helped you to solve your issue(s)

            ZgemboZ 1 Reply Last reply
            0
            • K koahnig

              @Zgembo

              Did you use flush or close the file?

              ZgemboZ Offline
              ZgemboZ Offline
              Zgembo
              wrote on last edited by
              #6

              @koahnig Yes, I have used flush and close.

              JonBJ 1 Reply Last reply
              0
              • ZgemboZ Zgembo

                @koahnig Yes, I have used flush and close.

                JonBJ Online
                JonBJ Online
                JonB
                wrote on last edited by JonB
                #7

                @Zgembo
                And you're saying the problem is on input, right? You have verified the output went to the file before you try to read from it, otherwise you would have told us if the file was empty, right? And readPatientExportFile is deffo opened correctly on it, right?

                ZgemboZ 1 Reply Last reply
                2
                • JonBJ JonB

                  @Zgembo
                  And you're saying the problem is on input, right? You have verified the output went to the file before you try to read from it, otherwise you would have told us if the file was empty, right? And readPatientExportFile is deffo opened correctly on it, right?

                  ZgemboZ Offline
                  ZgemboZ Offline
                  Zgembo
                  wrote on last edited by VRonin
                  #8

                  @JonB Well after further investigation I found out that my overloaded operators << and >> are not called at all. I do not know why.

                  In my .h fajl under public members I have put

                  friend QDataStream &operator<<(QDataStream& out, const PatientItem_t & patient);
                  friend QDataStream &operator>>(QDataStream& in, PatientItem_t & patient);
                  

                  and at the end of my .cpp fajl I have put:

                  QDataStream & operator<<(QDataStream &out, const PatientItem_t &patient)
                  {
                  	out << patient.PatientID
                  		<< patient.Name
                  		<< patient.LastName;
                  	return out;
                  }
                  
                  QDataStream & operator>>(QDataStream & in, PatientItem_t & patient)
                  {
                  	in >> patient.PatientID
                  		>> patient.Name
                  		>> patient.LastName;
                  	return in;
                  }
                  
                  1 Reply Last reply
                  0
                  • SGaistS Offline
                    SGaistS Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on last edited by
                    #9

                    Hi,

                    Can you show your header file content ?

                    Interested in AI ? www.idiap.ch
                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                    ZgemboZ 1 Reply Last reply
                    0
                    • SGaistS SGaist

                      Hi,

                      Can you show your header file content ?

                      ZgemboZ Offline
                      ZgemboZ Offline
                      Zgembo
                      wrote on last edited by VRonin
                      #10

                      @SGaist

                      #ifndef MAINWINDOW_H
                      #define MAINWINDOW_H
                      
                      #include <QMainWindow>
                      #include <QDataStream>
                      #include <QFile>
                      #include <QDate>
                      #include <QDebug>
                      
                      namespace Ui {
                      class MainWindow;
                      }
                      
                      typedef struct
                      {
                          int PatientID;
                          QString Name;
                          QString LastName;
                      
                      } PatientItem_t;
                      
                      class MainWindow : public QMainWindow
                      {
                          Q_OBJECT
                      
                      public:
                          explicit MainWindow(QWidget *parent = 0);
                          ~MainWindow();
                      
                          friend QDataStream &operator <<(QDataStream &stream,const PatientItem_t &patient);
                          friend QDataStream &operator >>(QDataStream &stream, PatientItem_t &patient);
                      
                      private:
                          Ui::MainWindow *ui;
                      };
                      
                      jsulmJ 1 Reply Last reply
                      0
                      • ZgemboZ Zgembo

                        @SGaist

                        #ifndef MAINWINDOW_H
                        #define MAINWINDOW_H
                        
                        #include <QMainWindow>
                        #include <QDataStream>
                        #include <QFile>
                        #include <QDate>
                        #include <QDebug>
                        
                        namespace Ui {
                        class MainWindow;
                        }
                        
                        typedef struct
                        {
                            int PatientID;
                            QString Name;
                            QString LastName;
                        
                        } PatientItem_t;
                        
                        class MainWindow : public QMainWindow
                        {
                            Q_OBJECT
                        
                        public:
                            explicit MainWindow(QWidget *parent = 0);
                            ~MainWindow();
                        
                            friend QDataStream &operator <<(QDataStream &stream,const PatientItem_t &patient);
                            friend QDataStream &operator >>(QDataStream &stream, PatientItem_t &patient);
                        
                        private:
                            Ui::MainWindow *ui;
                        };
                        
                        jsulmJ Offline
                        jsulmJ Offline
                        jsulm
                        Lifetime Qt Champion
                        wrote on last edited by
                        #11

                        @Zgembo said in Write/read struct to binary file using QDataStream:

                        friend QDataStream &operator <<(QDataStream &stream,const PatientItem_t &patient);
                        friend QDataStream &operator >>(QDataStream &stream, PatientItem_t &patient);

                        You should have those declared outside of the class as well.

                        https://forum.qt.io/topic/113070/qt-code-of-conduct

                        1 Reply Last reply
                        2
                        • VRoninV Offline
                          VRoninV Offline
                          VRonin
                          wrote on last edited by
                          #12

                          Why would you need them as friends of MainWindow anyway? just declare/define them as global functions

                          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                          ~Napoleon Bonaparte

                          On a crusade to banish setIndexWidget() from the holy land of Qt

                          1 Reply Last reply
                          3
                          • ZgemboZ Offline
                            ZgemboZ Offline
                            Zgembo
                            wrote on last edited by
                            #13

                            Thank you @jsulm and @VRonin . It works now!

                            1 Reply Last reply
                            0

                            • Login

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • Users
                            • Groups
                            • Search
                            • Get Qt Extensions
                            • Unsolved