diff --git a/src/io/fstream.cpp b/src/io/fstream.cpp index 042791d..e42dbe2 100644 --- a/src/io/fstream.cpp +++ b/src/io/fstream.cpp @@ -65,11 +65,21 @@ namespace fc { const boost::filesystem::path& bfp = file; my->ifs.open( bfp, std::ios::binary ); } + size_t ifstream::readsome( char* buf, size_t len ) { auto s = size_t(my->ifs.readsome( buf, len )); if( s <= 0 ) { - read( buf, 1 ); - s = 1; + try + { + read( buf, len ); + s = len; + } + catch (const fc::eof_exception& eof) + { + s = my->ifs.gcount(); + if (s == 0) + throw eof; + } } return s; } diff --git a/tests/io/stream_tests.cpp b/tests/io/stream_tests.cpp index c6779bb..e3f3dc8 100644 --- a/tests/io/stream_tests.cpp +++ b/tests/io/stream_tests.cpp @@ -112,11 +112,11 @@ BOOST_AUTO_TEST_CASE(fstream_test) BOOST_CHECK_THROW( in2.readsome( buf, 3, 0 ), fc::eof_exception ); { - out.flush(); + out.close(); std::fstream test( outf.path().to_native_ansi_path(), std::fstream::in ); - BOOST_CHECK_EQUAL( 11u, test.readsome( (&(*buf)), 11 ) ); + test.read( (&(*buf)), 11 ); BOOST_CHECK_EQUAL( "Hello world", std::string( (&(*buf)), 11 ) ); - BOOST_CHECK_EQUAL( 0u, test.readsome( (&(*buf)), 11 ) ); + BOOST_CHECK(!test.read( (&(*buf)), 11 )); test.close(); } @@ -166,11 +166,11 @@ BOOST_AUTO_TEST_CASE(buffered_fstream_test) BOOST_CHECK_THROW( bin2.readsome( buf, 3, 0 ), fc::eof_exception ); { - bout.flush(); + bout.close(); std::fstream test( outf.path().to_native_ansi_path(), std::fstream::in ); - BOOST_CHECK_EQUAL( 11u, test.readsome( (&(*buf)), 11 ) ); + test.read( (&(*buf)), 11 ); BOOST_CHECK_EQUAL( "Hello world", std::string( (&(*buf)), 11 ) ); - BOOST_CHECK_EQUAL( 0u, test.readsome( (&(*buf)), 11 ) ); + BOOST_CHECK(!test.read( (&(*buf)), 11 )); test.close(); } }