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

IStreamFile.h

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

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