// $Id$ /* ---------------------------------------------------------------- */ /* Copyright 2005 (c) by RWTH Aachen - Lehrstuhl fuer Informatik VI */ /* Richard Zens */ /* ---------------------------------------------------------------- */ #ifndef moses_File_h #define moses_File_h #include #include #include #include #include "util/exception.hh" #include "util/string_stream.hh" #include "TypeDef.h" #include "Util.h" namespace Moses { #ifdef WIN32 #ifdef __MINGW32__ #define OFF_T __int64 #define FTELLO(f) ftello64(f) #define FSEEKO(file, offset, origin) fseeko64(file, offset, origin) #else #define OFF_T __int64 #define FTELLO(file) _ftelli64(file) #define FSEEKO(file, offset, origin) _fseeki64(file, offset, origin) #endif #else #define OFF_T off_t #define FTELLO(f) ftello(f) #define FSEEKO(file, offset, origin) fseeko(file, offset, origin) #endif static const OFF_T InvalidOffT=-1; // WARNING: // these functions work only for bitwise read/write-able types template inline size_t fWrite(FILE* f,const T& t) { if(fwrite(&t,sizeof(t),1,f)!=1) { UTIL_THROW2("ERROR:: fwrite!"); } return sizeof(t); } template inline void fRead(FILE* f,T& t) { if(fread(&t,sizeof(t),1,f)!=1) { UTIL_THROW2("ERROR: fread!"); } } template inline size_t fWrite(FILE* f,const T* b,const T* e) { uint32_t s=std::distance(b,e); size_t rv=fWrite(f,s); if(fwrite(b,sizeof(T),s,f)!=s) { UTIL_THROW2("ERROR: fwrite!"); } return rv+sizeof(T)*s; } template inline size_t fWrite(FILE* f,const T b,const T e) { uint32_t s=std::distance(b,e); size_t rv=fWrite(f,s); if(fwrite(&(*b),sizeof(T),s,f)!=s) { UTIL_THROW2("ERROR: fwrite!"); } return rv+sizeof(T)*s; } template inline size_t fWriteVector(FILE* f,const C& v) { uint32_t s=v.size(); size_t rv=fWrite(f,s); if(fwrite(&v[0],sizeof(typename C::value_type),s,f)!=s) { UTIL_THROW2("ERROR: fwrite!"); } return rv+sizeof(typename C::value_type)*s; } template inline void fReadVector(FILE* f, C& v) { uint32_t s; fRead(f,s); v.resize(s); size_t r=fread(&(*v.begin()),sizeof(typename C::value_type),s,f); if(r!=s) { UTIL_THROW2("ERROR: freadVec! "<& v) { uint32_t s=v.size(); size_t totrv=fWrite(f,s); for (size_t i=0; i& v) { uint32_t s; fRead(f,s); v.resize(s); for (size_t i=0; i