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
00044 return *this;
00045 }
00046
00047 virtual IStream & operator>>(unsigned char *str) {
00048 file >> str;
00049
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
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
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
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
00138
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
00202
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
00265
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