angrymuffins
angrymuffins

Reputation: 45

C++ reading binary data to struct

I am currently reading a binary file that i know the structure of and i am trying to place into a struct but when i come to read off the binary file i am finding that when it prints out the struc individually it seems to come out right but then on the fourth read it seems to add it onto last member from the last read.

here the code which probably make's more sense than how i am explaining it:

Struc

#pragma pack(push, r1, 1)
struct header
{
    char headers[13];
    unsigned int number;
    char date[19];
    char fws[16];
    char collectversion[12];
    unsigned int seiral;
    char gain[12];
    char padding[16];

};

Main

  header head;
  int index = 0;
  fstream data;
  data.open(argv[1], ios::in | ios::binary);
  if(data.fail())
    {
      cout << "Unable to open the data file!!!" << endl;
      cout << "It looks Like Someone Has Deleted the file!"<<endl<<endl<<endl;
      return 0;

    }
   //check the size of head
   cout << "Size:" << endl;
   cout << sizeof(head) << endl;
   data.seekg(0,std::ios::beg);




   data.read( (char*)(&head.headers), sizeof(head.headers));

   data.read( (char*)(&head.number), sizeof(head.number));

   data.read( (char*)(&head.date), sizeof(head.date));

   data.read( (char*)head.fws, sizeof(head.fws));


//Here im just testing to see if the correct data went in.
   cout<<head.headers<< endl;
   cout<<head.number<< endl;
   cout<<head.date<< endl;
   cout<<head.fws<< endl;


   data.close();

   return 0;

Output

Size:
96
CF001 D 01.00
0
15/11/2013 12:16:56CF10001001002000
CF10001001002000

for some reason the fws seems to add to head.date? but when i take out the line to read head.fws i get a date that doesn't have anything added?

i also know thier more data to get for the header but i wanted to check the data up to what i have written is correct

cheers

Upvotes: 0

Views: 1651

Answers (2)

Mike Vine
Mike Vine

Reputation: 9837

You have char date[19] filled with 15/11/2013 12:16:56 which is exactly 19 valid characters. This leaves no space for a terminating null and so doing cout << head.date outputs your 19 valid characters and then a load of garbage.

Upvotes: 2

Mateusz Grzejek
Mateusz Grzejek

Reputation: 12058

1. Your date is declared as:

char date[19];

2. Your date format is exactly 19-characters long:

15/11/2013 12:16:56

3. And you print it this way:

cout<<head.date

Shortly speaking, you try to print fixed char[] using its address, which means, that it will be interpreted as null-terminated c-string. Is it null-terminated? No.

To solve this problem, declare date as:

char date[20];

And after you fill it, append null terminator:

date[19] = 0;

It applies to all members, that will be interpreted as string literals.

Upvotes: 8

Related Questions