problem with float or double serialization with binary archive VC 7.1 boost1.32 and 1.33

Hye, this little program fail in serialization of a float with binary archive but success with xml or text archive ?? as i am not an expert, i have now idea why ??? i have the save problem with double and like with float, only depending of the value .... it fails under windows XP, VC++7.1 but success under Linux + gcc thanks for helping , Stéphane. // problemeserialisation.cpp // #include <iostream> #include <fstream> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> #include <boost/archive/xml_oarchive.hpp> #include <boost/archive/xml_iarchive.hpp> void test_binary (float & f) { using namespace std ; std::ofstream ofs("val.bin"); boost::archive::binary_oarchive oa(ofs,std::ios::binary); oa<< f ; ofs.close(); std::cout << "Valeur serialisee binary " << f << std::endl ; std::ifstream ifs("val.bin"); boost::archive::binary_iarchive ia(ifs,std::ios::binary); float f1; ia >> f1; if (ifs.fail()) { cout << "badbit " << ( ifs.rdstate( ) & ios::badbit ) << endl; cout << "failbit " << ( ifs.rdstate( ) & ios::failbit ) << endl; cout << "eofbit " << ( ifs.rdstate( ) & ios::eofbit ) << endl; } std::cout << "Valeur deserialisee binary "<< f1 << std::endl ; ifs.close(); return ; } void test_text (float & f) { std::ofstream ofs("val.txt"); boost::archive::text_oarchive oa(ofs); oa << f ; ofs.close(); std::cout << "Valeur serialisee Texte " << f << std::endl ; std::ifstream ifs("val.txt"); boost::archive::text_iarchive ia(ifs); float f2 ; ia >> f2; std::cout << "Valeur deserialisee Texte "<< f2 << std::endl ; ifs.close(); return ; } void test_xml (float & f) { std::ofstream ofs("val.xml"); boost::archive::xml_oarchive oa(ofs); oa << BOOST_SERIALIZATION_NVP(f) ; ofs.close(); std::cout << "Valeur serialisee Xml " << f << std::endl ; std::ifstream ifs("val.xml"); boost::archive::xml_iarchive ia(ifs); float f2 ; ia >> BOOST_SERIALIZATION_NVP(f2); std::cout << "Valeur deserialisee Xml "<< f2 << std::endl ; ifs.close(); return ; } int main (int argc, const char * argv[]) { float f1 = (float)2.411667 ; test_text(f1); test_xml(f1); test_binary(f1); return 0; } output : Valeur serialisee Texte 2.41167 Valeur deserialisee Texte 2.41167 Valeur serialisee Xml 2.41167 Valeur deserialisee Xml 2.41167 Valeur serialisee binary 2.41167 badbit 0 failbit 2 eofbit 1 Valeur deserialisee binary -1.07137e+008

I believe that code like the following: std::ofstream ofs("val.bin"); boost::archive::binary_oarchive oa(ofs,std::ios::binary); oa<< f ; should be changed to: std::ofstream ofs("val.bin", std::ios::binary); boost::archive::binary_oarchive oa(ofs); oa<< f ; Robert Ramey "Stephane Martineau" <stephane.martineau@meteo.fr> wrote in message news:002b01c5973f$ec8fad60$234c8189@ICDI6... Hye, this little program fail in serialization of a float with binary archive but success with xml or text archive ?? as i am not an expert, i have now idea why ??? i have the save problem with double and like with float, only depending of the value .... it fails under windows XP, VC++7.1 but success under Linux + gcc thanks for helping , Stéphane. // problemeserialisation.cpp // #include <iostream> #include <fstream> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> #include <boost/archive/xml_oarchive.hpp> #include <boost/archive/xml_iarchive.hpp> void test_binary (float & f) { using namespace std ; std::ofstream ofs("val.bin"); boost::archive::binary_oarchive oa(ofs,std::ios::binary); oa<< f ; ofs.close(); std::cout << "Valeur serialisee binary " << f << std::endl ; std::ifstream ifs("val.bin"); boost::archive::binary_iarchive ia(ifs,std::ios::binary); float f1; ia >> f1; if (ifs.fail()) { cout << "badbit " << ( ifs.rdstate( ) & ios::badbit ) << endl; cout << "failbit " << ( ifs.rdstate( ) & ios::failbit ) << endl; cout << "eofbit " << ( ifs.rdstate( ) & ios::eofbit ) << endl; } std::cout << "Valeur deserialisee binary "<< f1 << std::endl ; ifs.close(); return ; } void test_text (float & f) { std::ofstream ofs("val.txt"); boost::archive::text_oarchive oa(ofs); oa << f ; ofs.close(); std::cout << "Valeur serialisee Texte " << f << std::endl ; std::ifstream ifs("val.txt"); boost::archive::text_iarchive ia(ifs); float f2 ; ia >> f2; std::cout << "Valeur deserialisee Texte "<< f2 << std::endl ; ifs.close(); return ; } void test_xml (float & f) { std::ofstream ofs("val.xml"); boost::archive::xml_oarchive oa(ofs); oa << BOOST_SERIALIZATION_NVP(f) ; ofs.close(); std::cout << "Valeur serialisee Xml " << f << std::endl ; std::ifstream ifs("val.xml"); boost::archive::xml_iarchive ia(ifs); float f2 ; ia >> BOOST_SERIALIZATION_NVP(f2); std::cout << "Valeur deserialisee Xml "<< f2 << std::endl ; ifs.close(); return ; } int main (int argc, const char * argv[]) { float f1 = (float)2.411667 ; test_text(f1); test_xml(f1); test_binary(f1); return 0; } output : Valeur serialisee Texte 2.41167 Valeur deserialisee Texte 2.41167 Valeur serialisee Xml 2.41167 Valeur deserialisee Xml 2.41167 Valeur serialisee binary 2.41167 badbit 0 failbit 2 eofbit 1 Valeur deserialisee binary -1.07137e+008 ------------------------------------------------------------------------------ _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users

ok that's cool ;) Now it works, thanks a lot . ----- Original Message ----- From: Robert Ramey To: boost-users@lists.boost.org Sent: Wednesday, August 03, 2005 6:25 AM Subject: Re: [Boost-users] problem with float or double serializationwithbinary archive VC 7.1 boost1.32 and 1.33 I believe that code like the following: std::ofstream ofs("val.bin"); boost::archive::binary_oarchive oa(ofs,std::ios::binary); oa<< f ; should be changed to: std::ofstream ofs("val.bin", std::ios::binary); boost::archive::binary_oarchive oa(ofs); oa<< f ; Robert Ramey "Stephane Martineau" <stephane.martineau@meteo.fr> wrote in message news:002b01c5973f$ec8fad60$234c8189@ICDI6... Hye, this little program fail in serialization of a float with binary archive but success with xml or text archive ?? as i am not an expert, i have now idea why ??? i have the save problem with double and like with float, only depending of the value .... it fails under windows XP, VC++7.1 but success under Linux + gcc thanks for helping , Stéphane. // problemeserialisation.cpp // #include <iostream> #include <fstream> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> #include <boost/archive/xml_oarchive.hpp> #include <boost/archive/xml_iarchive.hpp> void test_binary (float & f) { using namespace std ; std::ofstream ofs("val.bin"); boost::archive::binary_oarchive oa(ofs,std::ios::binary); oa<< f ; ofs.close(); std::cout << "Valeur serialisee binary " << f << std::endl ; std::ifstream ifs("val.bin"); boost::archive::binary_iarchive ia(ifs,std::ios::binary); float f1; ia >> f1; if (ifs.fail()) { cout << "badbit " << ( ifs.rdstate( ) & ios::badbit ) << endl; cout << "failbit " << ( ifs.rdstate( ) & ios::failbit ) << endl; cout << "eofbit " << ( ifs.rdstate( ) & ios::eofbit ) << endl; } std::cout << "Valeur deserialisee binary "<< f1 << std::endl ; ifs.close(); return ; } void test_text (float & f) { std::ofstream ofs("val.txt"); boost::archive::text_oarchive oa(ofs); oa << f ; ofs.close(); std::cout << "Valeur serialisee Texte " << f << std::endl ; std::ifstream ifs("val.txt"); boost::archive::text_iarchive ia(ifs); float f2 ; ia >> f2; std::cout << "Valeur deserialisee Texte "<< f2 << std::endl ; ifs.close(); return ; } void test_xml (float & f) { std::ofstream ofs("val.xml"); boost::archive::xml_oarchive oa(ofs); oa << BOOST_SERIALIZATION_NVP(f) ; ofs.close(); std::cout << "Valeur serialisee Xml " << f << std::endl ; std::ifstream ifs("val.xml"); boost::archive::xml_iarchive ia(ifs); float f2 ; ia >> BOOST_SERIALIZATION_NVP(f2); std::cout << "Valeur deserialisee Xml "<< f2 << std::endl ; ifs.close(); return ; } int main (int argc, const char * argv[]) { float f1 = (float)2.411667 ; test_text(f1); test_xml(f1); test_binary(f1); return 0; } output : Valeur serialisee Texte 2.41167 Valeur deserialisee Texte 2.41167 Valeur serialisee Xml 2.41167 Valeur deserialisee Xml 2.41167 Valeur serialisee binary 2.41167 badbit 0 failbit 2 eofbit 1 Valeur deserialisee binary -1.07137e+008 ---------------------------------------------------------------------------- _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users ------------------------------------------------------------------------------ _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
participants (2)
-
Robert Ramey
-
Stephane Martineau