$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Robert S. Grimes (rsgrimes_at_[hidden])
Date: 2006-03-13 21:42:43
Ah, yes, that makes much sense!  I think now I am no longer uneasy, now that
I understand the issue.  And such as simple answer, too!
Thanks!!!
> -----Original Message-----
> From: boost-users-bounces_at_[hidden]
> [mailto:boost-users-bounces_at_[hidden]]On Behalf Of Robert Ramey
> Sent: Monday, March 13, 2006 9:38 PM
> To: boost-users_at_[hidden]
> Subject: Re: [Boost-users] [serialization] Problem writing and reading
> insameblock, with work-around
>
>
> I suspect this is an issue related to the closing and flushing of file
> streams.
>
> Without yuor {} the output archive and stream aren't getting flushed and
> closed.
>
> So in an example like this you have to use the brackets to be sure that
> the appropriate destructors get called.
>
> Robert Ramey
>
> Robert S. Grimes wrote:
> > Hi all,
> >
> > It seems there is a problem with using both an output and an input
> > archive in the same code block.  Here is a simple sample that
> > illustrates the problem.  By defining the symbol BREAK_IT, you can
> > see the problem; not defining it, the example works.  What is
> > particularly odd is that it is throwing an std::bad_alloc from within
> > text_iarchive_impl<Archive>::load(std::string &s) in
> > text_iarchive_impl.ipp because the requested size is obviously wrong
> > - for example, 3435973837!!! I can't follow well enough what is
> > happening, but I have figured out a work-around from noticing the
> > differences between my example and demo.cpp; in the latter, the
> > writing and reading of an archive are performed in two separate
> > functions, or more precisely, two different blocks.  Is this normal?
> > Have I missed the documentation about this?  Still, seems rather
> > fussy, though to be honest, I'm not likely to suffer from the
> > workaround in "production" code, but it's a bit unnerving
> > nonetheless...
> >
> > Thanks!
> > -Bob
> >
> > Example follows:
> >
> > #include <fstream>
> > #include <iostream>
> > #include <string>
> >
> > #include <boost/archive/text_iarchive.hpp>
> > #include <boost/archive/text_oarchive.hpp>
> >
> > class Simple
> > {
> > private:
> >  int anIntMember;
> >  bool aBoolMember;
> >
> >  template<class Archive>
> >  void serialize(Archive & ar, const unsigned int file_version)
> >  {
> >   ar & BOOST_SERIALIZATION_NVP(anIntMember)
> >      & BOOST_SERIALIZATION_NVP(aBoolMember);
> >  }
> >
> >  // Grant access to serialization library
> >  friend class boost::serialization::access;
> >
> > public:
> >  Simple(): anIntMember(27), aBoolMember(false) {}
> >  int GetAnIntMember() const { return anIntMember; }
> >  void SetAnIntMember(int v) { anIntMember = v; }
> >  bool GetABoolMember() const { return aBoolMember; }
> >  void SetABoolMember(bool v) { aBoolMember = v; }
> > };
> >
> > #define BREAK_IT
> >
> > void TestBoostText(const Simple& parms)
> > {
> > #ifndef BREAK_IT
> >  {
> > #endif
> >  // Write out to boost archive
> >  std::ofstream ofs("./boost.txt");
> >  boost::archive::text_oarchive oa(ofs);
> >  oa << parms;   /// Could use a better XML element name
> > #ifndef BREAK_IT
> >  }
> > #endif
> >
> >  // Read it back and check
> >  Simple rparms;
> >  std::ifstream ifs("./boost.txt"); // THIS IS THE BROKEN LINE
> >  boost::archive::text_iarchive ia(ifs);
> >  ia >> rparms;
> >  std::cout << "Checking boost read...";
> >  if (rparms.GetAnIntMember() == 99) {
> >    std::cout << "Worked!!!" << std::endl;
> >  } else {
> >    std::cout << "Failed - appears not to have been updated" <<
> >  std::endl; }
> > }
> >
> > int main(int argc, char* argv[])
> > {
> > Simple parms;
> >
> >  // Modify parms for testing purposes
> >  parms.SetAnIntMember(99);
> >
> >  // Test both binary archives
> >  TestBoostText(parms);
> >
> >  return 0;
> > }
>
>
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://listarchives.boost.org/mailman/listinfo.cgi/boost-users