20 #define ROSTLAB_STDIO 1 27 template<
typename _Tp>
29 template<
typename _Tp,
typename _Alloc>
30 inline void fwrite(
const vector<_Tp,_Alloc>& __v, FILE* __out )
32 if( __v.size() > 0xffff ){ ostringstream s; s << __v.size() <<
" is out of range (0-65535)";
throw rostlab::range_error( s.str() ); }
33 fwrite<uint16_t>( __v.size(), __out );
34 if( ::
fwrite( __v.data(),
sizeof(
typename vector<_Tp,_Alloc>::value_type), __v.size(), __out ) != __v.size() )
throw rostlab::runtime_error( strerror(errno) );
39 fwrite<uint16_t>( __str.length(), __out );
40 if( !__str.length() )
return;
41 if( ::
fwrite( __str.c_str(),
sizeof( string::value_type ), __str.length(), __out ) != __str.length() )
throw rostlab::runtime_error( strerror(errno) );
43 inline void fwrite(
const char* __c, FILE* __out ) {
fwrite(
string(__c), __out ); }
45 template<
typename _Tp>
46 inline void fread( _Tp& __v, FILE* __in )
50 template<
typename _Tp,
typename _Alloc>
51 inline void fread( vector<_Tp, _Alloc>& __v, FILE* __in )
53 uint16_t size;
fread( size, __in);
54 __v = vector<_Tp, _Alloc>(size);
55 if( ::
fread( __v.data(),
sizeof(
typename vector<_Tp, _Alloc>::value_type), __v.size(), __in ) != __v.size() )
throw rostlab::runtime_error( strerror(errno) );
60 uint16_t strlen;
fread( strlen, __in);
61 if( !strlen ){ __v = string();
return; }
63 string::value_type buf[
sizeof( string::value_type ) * strlen ];
64 size_t managed_to_read =
::fread( buf,
sizeof( string::value_type ), strlen, __in );
66 __v = string( buf, managed_to_read );
69 template<
typename _Tp>
70 inline _Tp
fread( FILE* __in ){ _Tp ret;
fread( ret, __in );
return ret; }
74 #endif // ROSTLAB_STDIO void fwrite(const _Tp &__v, FILE *__out)
void fwrite< string >(const string &__str, FILE *__out)
void fread< string >(string &__v, FILE *__in)
void fread(_Tp &__v, FILE *__in)