00001 #ifndef SCT_FILE_ISTREAMFILE2_H
00002 #define SCT_FILE_ISTREAMFILE2_H
00003
00004 #include "../IStream.h"
00005 #include "../IoExceptions.h"
00006
00007 #include <cstdio>
00008 #include <string>
00009 #include <cstring>
00010
00011 using std::fopen;
00012 using std::fclose;
00013 using std::fread;
00014 using std::ftell;
00015 using std::string;
00016 using std::strcpy;
00017 using std::cout;
00018 using std::endl;
00019
00020 namespace Sct {
00021 namespace File {
00022
00023 template<typename T>
00024 void readArray(FILE* file, T* p, size_t size, size_t actualSize);
00025
00026 template<typename T>
00027 void readArrayCreate(FILE* file, T** p, size_t& size);
00028
00029 template<typename T>
00030 void readArrayNoCreate(FILE* file, T* p, size_t size);
00031
00032 template<typename T>
00033 void read(FILE* f, T& p);
00034
00035 class IStreamFile2 : public virtual IStream {
00036 public:
00037 IStreamFile2(const string& fileName) : file(0) {
00038 file = fopen(fileName.c_str(), "rb");
00039 if (!file) {
00040 throw FileException(fileName, "Couldn't open file", __FILE__, __LINE__);
00041 }
00042 }
00043
00044 virtual ~IStreamFile2() {
00045 if (file) {
00046 fclose(file);
00047 }
00048 }
00049
00050 virtual IStream & operator>>(char *str) {
00051 readArrayNoCreate(file, str, ULONG_MAX);
00052 return *this;
00053 }
00054
00055 virtual IStream & operator>>(unsigned char *str) {
00056 readArrayNoCreate(file, str, ULONG_MAX);
00057 return *this;
00058 }
00059
00060 virtual IStream & operator>>(char **str) {
00061 size_t size;
00062 readArrayCreate(file, str, size);
00063 return *this;
00064 }
00065
00066 virtual IStream & operator>>(unsigned char **str) {
00067 size_t size;
00068 readArrayCreate(file, str, size);
00069 return *this;
00070 }
00071
00072 virtual IStream & operator>>(bool& val) {
00073 read(file, val);
00074 return *this;
00075 }
00076
00077 virtual IStream & operator>>(char& val) {
00078 read(file, val);
00079 return *this;
00080 }
00081
00082 virtual IStream & operator>>(unsigned char& val) {
00083 read(file, val);
00084 return *this;
00085 }
00086
00087 virtual IStream & operator>>(short& val) {
00088 read(file, val);
00089 return *this;
00090 }
00091
00092 virtual IStream & operator>>(unsigned short& val) {
00093 read(file, val);
00094 return *this;
00095 }
00096
00097 virtual IStream & operator>>(int& val) {
00098 read(file, val);
00099 return *this;
00100 }
00101
00102 virtual IStream & operator>>(unsigned int& val) {
00103 read(file, val);
00104 return *this;
00105 }
00106
00107 virtual IStream & operator>>(long& val) {
00108 read(file, val);
00109 return *this;
00110 }
00111
00112 virtual IStream & operator>>(unsigned long& val) {
00113 read(file, val);
00114 return *this;
00115 }
00116
00117 virtual IStream & operator>>(float& val) {
00118 read(file, val);
00119 return *this;
00120 }
00121
00122 virtual IStream & operator>>(double& val) {
00123 read(file, val);
00124 return *this;
00125 }
00126
00127 virtual IStream & operator>>(std::string& val) {
00128 char* buffer;
00129 *this >> &buffer;
00130 val = buffer;
00131 return *this;
00132 }
00133
00134
00135
00136
00137
00138 virtual IStream & get ( bool ** p, size_t & size ) {
00139 readArrayCreate(file, p, size);
00140 return *this;
00141 }
00142
00143 virtual IStream & get ( char ** p, size_t & size ) {
00144 readArrayCreate(file, p, size);
00145 return *this;
00146 }
00147
00148 virtual IStream & get ( unsigned char ** p, size_t & size ) {
00149 readArrayCreate(file, p, size);
00150 return *this;
00151 }
00152
00153 virtual IStream & get( short ** p, size_t & size ) {
00154 readArrayCreate(file, p, size);
00155 return *this;
00156 }
00157
00158 virtual IStream & get( unsigned short ** p, size_t & size ) {
00159 readArrayCreate(file, p, size);
00160 return *this;
00161 }
00162
00163 virtual IStream & get( int ** p, size_t & size ) {
00164 readArrayCreate(file, p, size);
00165 return *this;
00166 }
00167
00168 virtual IStream & get( unsigned int ** p, size_t & size ) {
00169 readArrayCreate(file, p, size);
00170 return *this;
00171 }
00172
00173 virtual IStream & get( long ** p, size_t & size ) {
00174 readArrayCreate(file, p, size);
00175 return *this;
00176 }
00177
00178 virtual IStream & get( unsigned long ** p, size_t & size ) {
00179 readArrayCreate(file, p, size);
00180 return *this;
00181 }
00182
00183 virtual IStream & get( float ** p, size_t & size ) {
00184 readArrayCreate(file, p, size);
00185 return *this;
00186 }
00187
00188 virtual IStream & get( double ** p, size_t & size ) {
00189 readArrayCreate(file, p, size);
00190 return *this;
00191 }
00192
00193 virtual IStream & get( std::string ** p, size_t & size ) {
00194 readArrayCreate(file, p, size);
00195 return *this;
00196 }
00197
00198
00199
00200
00201 virtual IStream & get( bool * const p, const size_t size ) {
00202 readArrayNoCreate(file, p, size);
00203 return *this;
00204 }
00205
00206 virtual IStream & get( char * const p, const size_t size ) {
00207 readArrayNoCreate(file, p, size);
00208 return *this;
00209 }
00210
00211 virtual IStream & get( unsigned char * const p, const size_t size ) {
00212 readArrayNoCreate(file, p, size);
00213 return *this;
00214 }
00215
00216 virtual IStream & get( short * const p, const size_t size ) {
00217 readArrayNoCreate(file, p, size);
00218 return *this;
00219 }
00220
00221 virtual IStream & get( unsigned short * const p, const size_t size ) {
00222 readArrayNoCreate(file, p, size);
00223 return *this;
00224 }
00225
00226 virtual IStream & get( int * const p, const size_t size ) {
00227 readArrayNoCreate(file, p, size);
00228 return *this;
00229 }
00230
00231 virtual IStream & get( unsigned int * const p, const size_t size ) {
00232 readArrayNoCreate(file, p, size);
00233 return *this;
00234 }
00235
00236 virtual IStream & get( long * const p, const size_t size ) {
00237 readArrayNoCreate(file, p, size);
00238 return *this;
00239 }
00240
00241 virtual IStream & get( unsigned long * const p, const size_t size ) {
00242 readArrayNoCreate(file, p, size);
00243 return *this;
00244 }
00245
00246 virtual IStream & get( float * const p, const size_t size ) {
00247 readArrayNoCreate(file, p, size);
00248 return *this;
00249 }
00250
00251 virtual IStream & get( double * const p, const size_t size ) {
00252 readArrayNoCreate(file, p, size);
00253 return *this;
00254 }
00255
00256 virtual IStream & get( std::string * const p, const size_t size ) {
00257 readArrayNoCreate(file, p, size);
00258 return *this;
00259 }
00260
00261
00262
00263
00264 private:
00265 FILE* file;
00266 };
00267
00268 template<typename T>
00269 void readArray(FILE* file, T* p, size_t size, size_t actualSize) {
00270 if (size >= actualSize) {
00271 fread(p, sizeof(T), actualSize, file);
00272 return;
00273 } else {
00274 cout << "Reading less than stored array size - buffer size: " << size << " actual size: " << actualSize << " at: " << ftell(file) << endl;
00275 fread(p, sizeof(T), size, file);
00276 T temp[actualSize-size];
00277 fread(&temp, sizeof(T), actualSize-size, file);
00278 }
00279 }
00280
00281 template<typename T>
00282 void readArrayCreate(FILE* file, T** p, size_t& size) {
00283
00284 read(file, size);
00285
00286 *p = new T[size];
00287 readArray(file, *p, size, size);
00288 }
00289
00290 template<typename T>
00291 void readArrayNoCreate(FILE* file, T* p, size_t size) {
00292
00293 size_t actualSize = 0;
00294 read(file, actualSize);
00295
00296 readArray(file, p, size, actualSize);
00297 }
00298
00299 template<typename T>
00300 void read(FILE* f, T& p) {
00301 fread(&p, sizeof(T), 1, f);
00302 }
00303
00304 }
00305 }
00306 #endif //SCT_FILE_ISTREAMFILE2_H