00001
00002
00003
00004
00005
00006
00007 #ifndef moses_File_h
00008 #define moses_File_h
00009
00010 #include <cstdio>
00011 #include <iostream>
00012 #include <vector>
00013 #include "util/check.hh"
00014 #include "UserMessage.h"
00015 #include "TypeDef.h"
00016 #include "Util.h"
00017
00018 namespace Moses
00019 {
00020
00021 #ifdef WIN32
00022 #define OFF_T __int64
00023 #define FTELLO(file) _ftelli64(file)
00024 #define FSEEKO(file, offset, origin) _fseeki64(file, offset, origin)
00025
00026 #else
00027 #define OFF_T off_t
00028 #define FTELLO(f) ftello(f)
00029 #define FSEEKO(file, offset, origin) fseeko(file, offset, origin)
00030 #endif
00031
00032 static const OFF_T InvalidOffT=-1;
00033
00034
00035
00036
00037 template<typename T> inline size_t fWrite(FILE* f,const T& t)
00038 {
00039 if(fwrite(&t,sizeof(t),1,f)!=1) {
00040 TRACE_ERR("ERROR:: fwrite!\n");
00041 abort();
00042 }
00043 return sizeof(t);
00044 }
00045
00046 template<typename T> inline void fRead(FILE* f,T& t)
00047 {
00048 if(fread(&t,sizeof(t),1,f)!=1) {
00049 TRACE_ERR("ERROR: fread!\n");
00050 abort();
00051 }
00052 }
00053
00054 template<typename T> inline size_t fWrite(FILE* f,const T* b,const T* e)
00055 {
00056 UINT32 s=std::distance(b,e);
00057 size_t rv=fWrite(f,s);
00058 if(fwrite(b,sizeof(T),s,f)!=s) {
00059 TRACE_ERR("ERROR: fwrite!\n");
00060 abort();
00061 }
00062 return rv+sizeof(T)*s;
00063 }
00064
00065 template<typename T> inline size_t fWrite(FILE* f,const T b,const T e)
00066 {
00067 UINT32 s=std::distance(b,e);
00068 size_t rv=fWrite(f,s);
00069 if(fwrite(&(*b),sizeof(T),s,f)!=s) {
00070 TRACE_ERR("ERROR: fwrite!\n");
00071 abort();
00072 }
00073 return rv+sizeof(T)*s;
00074 }
00075
00076 template<typename C> inline size_t fWriteVector(FILE* f,const C& v)
00077 {
00078 UINT32 s=v.size();
00079 size_t rv=fWrite(f,s);
00080 if(fwrite(&v[0],sizeof(typename C::value_type),s,f)!=s) {
00081 TRACE_ERR("ERROR: fwrite!\n");
00082 abort();
00083 }
00084 return rv+sizeof(typename C::value_type)*s;
00085 }
00086
00087 template<typename C> inline void fReadVector(FILE* f, C& v)
00088 {
00089 UINT32 s;
00090 fRead(f,s);
00091 v.resize(s);
00092 size_t r=fread(&(*v.begin()),sizeof(typename C::value_type),s,f);
00093 if(r!=s) {
00094 TRACE_ERR("ERROR: freadVec! "<<r<<" "<<s<<"\n");
00095 abort();
00096 }
00097 }
00098
00099 inline size_t fWriteString(FILE* f,const char* e, UINT32 s)
00100 {
00101 size_t rv=fWrite(f,s);
00102 if(fwrite(e,sizeof(char),s,f)!=s) {
00103 TRACE_ERR("ERROR:: fwrite!\n");
00104 abort();
00105 }
00106 return rv+sizeof(char)*s;
00107 }
00108
00109 inline void fReadString(FILE* f,std::string& e)
00110 {
00111 UINT32 s;
00112 fRead(f,s);
00113 char* a=new char[s+1];
00114 if(fread(a,sizeof(char),s,f)!=s) {
00115 TRACE_ERR("ERROR: fread!\n");
00116 abort();
00117 }
00118 a[s]='\0';
00119 e.assign(a);
00120 delete[](a);
00121 }
00122
00123 inline size_t fWriteStringVector(FILE* f,const std::vector<std::string>& v)
00124 {
00125 UINT32 s=v.size();
00126 size_t totrv=fWrite(f,s);
00127 for (size_t i=0; i<s; i++) {
00128 totrv+=fWriteString(f,v.at(i).c_str(),v.at(i).size());
00129 }
00130 return totrv;
00131 }
00132
00133 inline void fReadStringVector(FILE* f, std::vector<std::string>& v)
00134 {
00135 UINT32 s;
00136 fRead(f,s);
00137 v.resize(s);
00138
00139 for (size_t i=0; i<s; i++) {
00140 fReadString(f,v.at(i));
00141 }
00142 }
00143
00144 inline OFF_T fTell(FILE* f)
00145 {
00146 return FTELLO(f);
00147 }
00148
00149 inline void fSeek(FILE* f,OFF_T o)
00150 {
00151 if(FSEEKO(f,o,SEEK_SET)<0) {
00152 TRACE_ERR("ERROR: could not fseeko position "<<o<<"\n");
00153 if(o==InvalidOffT) TRACE_ERR("You tried to seek for 'InvalidOffT'!\n");
00154 abort();
00155 }
00156 }
00157
00158 inline FILE* fOpen(const char* fn,const char* m)
00159 {
00160 if(FILE* f=fopen(fn,m))
00161 return f;
00162 else {
00163 UserMessage::Add(std::string("ERROR: could not open file ") + fn + " with mode " + m + "\n");
00164 CHECK(false);
00165 return NULL;
00166 }
00167 }
00168 inline void fClose(FILE* f)
00169 {
00170 fclose(f);
00171 }
00172
00173 }
00174
00175 #endif