// $Id$ /* ---------------------------------------------------------------- */ /* Copyright 2005 (c) by RWTH Aachen - Lehrstuhl fuer Informatik VI */ /* Richard Zens */ /* ---------------------------------------------------------------- */ #ifndef FILE_H_ #define FILE_H_ #include #include #include #include #include "UserMessage.h" #include "TypeDef.h" #include "Util.h" #ifdef WIN32 #define OFF_T __int64 #define FTELLO(file) _ftelli64(file) #define FSEEKO(file, offset, origin) _fseeki64(file, offset, origin) #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) { TRACE_ERR("ERROR:: fwrite!\n");abort();} return sizeof(t); } template inline void fRead(FILE* f,T& t) { if(fread(&t,sizeof(t),1,f)!=1) {TRACE_ERR("ERROR: fread!\n");abort();} } template inline size_t fWrite(FILE* f,const T* b,const T* e) { UINT32 s=std::distance(b,e);size_t rv=fWrite(f,s); if(fwrite(b,sizeof(T),s,f)!=s) {TRACE_ERR("ERROR: fwrite!\n");abort();} return rv+sizeof(T)*s; } template inline size_t fWrite(FILE* f,const T b,const T e) { UINT32 s=std::distance(b,e);size_t rv=fWrite(f,s); if(fwrite(&(*b),sizeof(T),s,f)!=s) {TRACE_ERR("ERROR: fwrite!\n");abort();} return rv+sizeof(T)*s; } template inline size_t fWriteVector(FILE* f,const C& v) { UINT32 s=v.size(); size_t rv=fWrite(f,s); if(fwrite(&v[0],sizeof(typename C::value_type),s,f)!=s) {TRACE_ERR("ERROR: fwrite!\n");abort();} return rv+sizeof(typename C::value_type)*s; } template inline void fReadVector(FILE* f, C& v) { UINT32 s;fRead(f,s);v.resize(s); size_t r=fread(&(*v.begin()),sizeof(typename C::value_type),s,f); if(r!=s) { TRACE_ERR("ERROR: freadVec! "<