Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 291
  • Last Modified:

How to write a struct to a file?

Hi!

I would like to know if there is any way to write a entira struct to a file.
I have a struct that i have got from a TCP connection it looks like this.

TCPConn2->ReadBuffer(VMes,sizeof(*mes));
mes = static_cast<Message*>(VMes);

The mes is the structure and it looks like this

typedef struct{
        __int32 Param_code;
        unsigned __int32 Time;
        __int32 Measure_Value;
}S_record;

typedef struct{
        //--------HEADERS-------
        unsigned __int16 STX;
      unsigned __int16 CRC;
        unsigned __int16 MachID;
        unsigned __int16 ClinicalSWID;
        unsigned __int32 MsgCounter;
        unsigned __int32 CmdCode;
        unsigned __int32 MsgInfo;
        unsigned __int32 Flags;
        unsigned __int32 PatId;
        //----------------------
        S_record records[412];  
}Message;

I would now like to write mes to a file. I know that i can use ifstream but then i have to convert each element to string if i have't missunderstod it.
Is there a way to write the data without converting it?
0
mikrodidakt
Asked:
mikrodidakt
  • 5
  • 4
  • 3
1 Solution
 
bastibartelCommented:
Hi mikrodidakt,

You can write the entire struct to file in a binary format. That is, if you are sure the struct will not change in the near future ;-)


#include <fstream>
Message Msg;

std::ofstream oStream;
oStream.open("c:\\full path\\out.txt",std::fstream::out|std::ios::binary);
oStream.write(Msg, sizeof(Msg));
oStream.close()

Please do verify that sizeof(Msg) returns the size of your struct, as I am not absolutely sure the embdeded space for S_record[412] will be reflected properly by sizeof()
Other than that, since you have no dynamic objects in your struct - you are all set.

Cheers!
Sebastian
0
 
bastibartelCommented:
Uups, it's

oStream.open("c:\\full path\\out.txt",std::fstream::out|std::ios<wbr/>s::binary)<wbr/>;
                                                                                               ^
0
 
bastibartelCommented:
aaahh forget the last post - (screw QuickPost !)
0
Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

 
nafis_devlprCommented:
use ofstream and use the binary mode to write into the file, but in case you change the allignment or add anything else in the structure you will have to change the old files.

Nafis
0
 
nafis_devlprCommented:
sorry bastibartel, i was a bit late than you.
0
 
mikrodidaktAuthor Commented:
thanks
0
 
mikrodidaktAuthor Commented:
But why would there be a problem if the size of the struct is changed then the sizeof(mes) will also be change?
0
 
mikrodidaktAuthor Commented:
sorry you have alreadt answered the question forget the last one thanks.
0
 
nafis_devlprCommented:
when you change the struct, then the size is changed. You wont see any difference if you replace a variable with the same size. But the interpretation of the struct might change because of that
0
 
bastibartelCommented:
Hi again,

> But why would there be a problem if the size of the struct is changed then the sizeof(mes) will also be change?
Yes that is correct - you just won't be able to import your 'old' structs anymore.

Owing to this potential problem, Microsoft prefixes many structs with a variable holding the struct's size.
Thus you can later determine (by importing the first say 4 bytes), whether a stored struct is compatible with the current version of the struct.

Cheers,
Sebastian
 

0
 
mikrodidaktAuthor Commented:
This is for programmers that might have the same problem as me in the future.
Her is my conde.

std::ofstream oStream;
AnsiString path = "C:\\Program\\Borland\\CBuilder6\\Projects\\Prismaflex\\Samples\\Sample";
path += IntToStr(messageNbr);

oStream.open(path.c_str(),std::fstream::out|std::ios::binary);
char* c_msg = (char*) msg;
oStream.write(c_msg, sizeof(msg));
oStream.close();
0
 
mikrodidaktAuthor Commented:
Forget the comment above it dont work!!!!!!!!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

  • 5
  • 4
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now