Help with binary I/O

J

joseph.redimerio

Hi there,

I'm trying to save a vector data structure to a binary file, then read
it back and see if all the contents are intact. So I'm trying to
following code below :


#include "stdafx.h"
#include <stdio.h>
#include <vector>
#include <iostream>
#include <fstream>

using namespace std;

void main() {

//
// Create a test vector of integers and populate with test data
//
vector<int> int_ls;

int_ls.push_back(100);
int_ls.push_back(200);
int_ls.push_back(300);
int_ls.push_back(400);
int_ls.push_back(500);

//
// Dump the contents of the integer vector to a binary file
//
fstream binfile("fstream.out", ios::eek:ut|ios::binary);
binfile.seekp(0, ios::end);
binfile.write((char*)&int_ls,sizeof(int_ls));
binfile.close();


//
// Re-open the binary file and this time read the values and
store again in vector structure
//
vector<int> int_ls2;
fstream binfile2("fstream.out", ios::eek:ut|ios::in|ios::binary);
binfile2.seekg(0, ios::beg);

while (!binfile2.eof()) {
binfile2.read((char*)&int_ls2, sizeof(int_ls2));
}

binfile2.close();


//
// Now let's display what we just read in
//
int DATA_SIZE = int_ls2.size();

for (i=0; i<DATA_SIZE; i++) {
printf("\n int_ls2[%d] --> %d", i, int_ls2);
};

}


** The above code manages to save to a file and even retrieve all the
values, but somehow I get an assert before it terminates.

** More info: I'm compiling it using Visual C++ 2008 as a Console
Application.

Thanks in Advance,
Joseph
 
Z

zr

Hi there,

I'm trying to save a vector data structure to a binary file, then read
it back and see if all the contents are intact.  So I'm trying to
following code below :

#include "stdafx.h"
#include <stdio.h>
#include <vector>
#include <iostream>
#include <fstream>

using namespace std;

void main() {

      //
      // Create a test vector of integers and populate with test data
      //
      vector<int> int_ls;

      int_ls.push_back(100);
      int_ls.push_back(200);
      int_ls.push_back(300);
      int_ls.push_back(400);
      int_ls.push_back(500);

      //
      // Dump the contents of the integer vector to a binary file
      //
      fstream binfile("fstream.out", ios::eek:ut|ios::binary);
      binfile.seekp(0, ios::end);
      binfile.write((char*)&int_ls,sizeof(int_ls));
      binfile.close();

      //
      // Re-open the binary file and this time read the values and
store again in vector structure
      //
      vector<int> int_ls2;
      fstream binfile2("fstream.out", ios::eek:ut|ios::in|ios::binary);
      binfile2.seekg(0, ios::beg);

      while (!binfile2.eof()) {
           binfile2.read((char*)&int_ls2, sizeof(int_ls2));
      }

      binfile2.close();

      //
      // Now let's display what we just read in
      //
      int DATA_SIZE = int_ls2.size();

      for (i=0; i<DATA_SIZE; i++) {
            printf("\n int_ls2[%d] --> %d", i, int_ls2);
      };

}

** The above code manages to save to a file and even retrieve all the
values, but somehow I get an assert before it terminates.

** More info: I'm compiling it using Visual C++ 2008 as a Console
Application.

Thanks in Advance,
Joseph


A couple of errors i spotted:

1) binfile.write((char*)&int_ls,sizeof(int_ls));
sizeof(int_ls) returns the size of the container object. What you
probably meant was the size of the objects stored by the container
objects. A quick solution (perhaps not the most elegant) is:
binfile.write((char*)&int_ls.front(), int_ls.size()*sizeof int_ls[0]);

2) The while loop: similar problem as above. Try:
int buffer;
binfile2.read((char*)&buffer, sizeof(buffer));
while (!binfile2.eof()) {
int_ls2.push_back(buffer);
binfile2.read((char*)&buffer, sizeof(buffer));
}
 
R

Rolf Magnus

main() must return int in C++.
//
// Create a test vector of integers and populate with test data
//
vector<int> int_ls;

int_ls.push_back(100);
int_ls.push_back(200);
int_ls.push_back(300);
int_ls.push_back(400);
int_ls.push_back(500);

//
// Dump the contents of the integer vector to a binary file
//
fstream binfile("fstream.out", ios::eek:ut|ios::binary);
binfile.seekp(0, ios::end);
binfile.write((char*)&int_ls,sizeof(int_ls));
binfile.close();

//
// Re-open the binary file and this time read the values and
store again in vector structure
//
vector<int> int_ls2;
fstream binfile2("fstream.out", ios::eek:ut|ios::in|ios::binary);
binfile2.seekg(0, ios::beg);

while (!binfile2.eof()) {
binfile2.read((char*)&int_ls2, sizeof(int_ls2));
}

binfile2.close();

//
// Now let's display what we just read in
//
int DATA_SIZE = int_ls2.size();

for (i=0; i<DATA_SIZE; i++) {
printf("\n int_ls2[%d] --> %d", i, int_ls2);
};

}

** The above code manages to save to a file and even retrieve all the
values, but somehow I get an assert before it terminates.

** More info: I'm compiling it using Visual C++ 2008 as a Console
Application.

Thanks in Advance,
Joseph


A couple of errors i spotted:

1) binfile.write((char*)&int_ls,sizeof(int_ls));
sizeof(int_ls) returns the size of the container object. What you
probably meant was the size of the objects stored by the container
objects. A quick solution (perhaps not the most elegant) is:
binfile.write((char*)&int_ls.front(), int_ls.size()*sizeof int_ls[0]);


You shouldn't use int_ls.front() for one function arguemnt and int_ls[0] for
the other. They are both the same thing.
2) The while loop: similar problem as above. Try:
int buffer;
binfile2.read((char*)&buffer, sizeof(buffer));
while (!binfile2.eof()) {
int_ls2.push_back(buffer);
binfile2.read((char*)&buffer, sizeof(buffer));
}

This is more complicated than necessary. Also, it will result in an endless
loop filling up all available memory if any error happens to the stream
during reading. I'd rather suggest:

while (binfile2.read((char*)&buffer, sizeof(buffer)))
{
int_ls2.push_back(buffer);
}

Then after the loop, check if eof was reached or some error happened.
 
J

James Kanze

I'm trying to save a vector data structure to a binary file,
then read it back and see if all the contents are intact.

What is the format of the binary file? (Until you've answered
that, there's no way we can tell you what you have to do.)
 
J

joseph.redimerio

Hi there,
I'm trying to save a vector data structure to a binary file, then read
it back and see if all the contents are intact.  So I'm trying to
following code below :
#include "stdafx.h"
#include <stdio.h>
#include <vector>
#include <iostream>
#include <fstream>
using namespace std;
void main() {
      //
      // Create a test vector of integers and populate with test data
      //
      vector<int> int_ls;
      int_ls.push_back(100);
      int_ls.push_back(200);
      int_ls.push_back(300);
      int_ls.push_back(400);
      int_ls.push_back(500);
      //
      // Dump the contents of the integer vector to a binary file
      //
      fstream binfile("fstream.out", ios::eek:ut|ios::binary);
      binfile.seekp(0, ios::end);
      binfile.write((char*)&int_ls,sizeof(int_ls));
      binfile.close();
      //
      // Re-open the binary file and this time read the values and
store again in vector structure
      //
      vector<int> int_ls2;
      fstream binfile2("fstream.out", ios::eek:ut|ios::in|ios::binary);
      binfile2.seekg(0, ios::beg);
      while (!binfile2.eof()) {
           binfile2.read((char*)&int_ls2, sizeof(int_ls2));
      }
      binfile2.close();
      //
      // Now let's display what we just read in
      //
      int DATA_SIZE = int_ls2.size();
      for (i=0; i<DATA_SIZE; i++) {
            printf("\n int_ls2[%d] --> %d", i, int_ls2);
      };

** The above code manages to save to a file and even retrieve all the
values, but somehow I get an assert before it terminates.

** More info: I'm compiling it using Visual C++ 2008 as a Console
Application.
Thanks in Advance,
Joseph

A couple of errors i spotted:

1) binfile.write((char*)&int_ls,sizeof(int_ls));
sizeof(int_ls) returns the size of the container object. What you
probably meant was the size of the objects stored by the container
objects. A quick solution (perhaps not the most elegant) is:
binfile.write((char*)&int_ls.front(), int_ls.size()*sizeof int_ls[0]);

2) The while loop: similar problem as above. Try:
          int buffer;
          binfile2.read((char*)&buffer, sizeof(buffer));
          while (!binfile2.eof()) {
                  int_ls2.push_back(buffer);
                  binfile2.read((char*)&buffer, sizeof(buffer));
        }- Hide quoted text -

- Show quoted text -




Thanks for the suggestions everyone !! I tried all of them, and I
found this one works the best! Thank you very much ZR.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top