Main Page   Modules   Namespace List   Class Hierarchy   Data Structures   File List   Namespace Members   Data Fields   Globals   Related Pages  

IStreamFile2.h

Go to the documentation of this file.
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     //    virtual IStream & operator>>(OWLDate& val) = 0;
00135     //    virtual IStream & operator>>(OWLTime& val) = 0;
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     //    virtual IStream & get( OWLDate ** p, size_t & size ) = 0;
00199     //    virtual IStream & get( OWLTime ** p, size_t & size ) = 0;
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     //    virtual IStream & get( OWLDate * const p, const size_t size ) = 0;
00262     //    virtual IStream & get( OWLTime * const p, const size_t size ) = 0;
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     //cout << "readArrayCreate at: " << ftell(file) << endl;
00284     read(file, size);
00285     //cout << "Create array: " << size << endl;
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     //cout << "readArrayNoCreate at: " << ftell(file) << endl;
00293     size_t actualSize = 0;
00294     read(file, actualSize);
00295     //cout << "Read array: " << actualSize <<  "buffer size: " << size << endl;
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

Generated on Mon Dec 15 19:36:05 2003 for SCT DAQ/DCS Software by doxygen1.3-rc3