00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include <fstream>
00042 #include <string>
00043 #include <sstream>
00044
00045 #include <qgarlib/AbstractFile.H>
00046 #include <qgarlib/QgarErrorIO.H>
00047 #include <qgarlib/QgarErrorInvalidArg.H>
00048 #include <qgarlib/QgarErrorUser.H>
00049
00050
00051 namespace qgar
00052 {
00053
00054
00055
00056
00057
00058
00059
00060 AbstractFile::AbstractFile(const char* aFileName)
00061
00062 throw(QgarErrorInvalidArg)
00063
00064 : _fileStatus(QGE_FILE_STATUS_CLOSED)
00065
00066 {
00067 _fileStream.close();
00068
00069 if (aFileName == 0)
00070 {
00071 throw QgarErrorInvalidArg(__FILE__, __LINE__,
00072 "qgar::AbstractFile::AbstractFile(const char*)",
00073 "File name not instantiated");
00074 }
00075
00076 if (*aFileName == '\0')
00077 {
00078 throw QgarErrorInvalidArg(__FILE__, __LINE__,
00079 "qgar::AbstractFile::AbstractFile(const char*)",
00080 "Empty file name");
00081 }
00082
00083 _fileName = new char[strlen(aFileName) + 1];
00084 strcpy(_fileName, aFileName);
00085 }
00086
00087
00088
00089
00090
00091
00092
00093 AbstractFile::~AbstractFile()
00094 {
00095 delete [] _fileName;
00096 }
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 void
00107 AbstractFile::openRONLY()
00108
00109 throw(QgarErrorIO)
00110
00111 {
00112 close();
00113
00114 _fileStream.clear();
00115 _fileStream.open(_fileName, std::ios::in | std::ios::binary);
00116
00117 if (!_fileStream)
00118 {
00119 std::ostringstream os;
00120 os << "Cannot open input file: "
00121 << _fileName;
00122 throw QgarErrorIO(__FILE__, __LINE__,
00123 "void qgar::AbstractFile::openRONLY()",
00124 os.str());
00125 }
00126
00127 _fileStatus = QGE_FILE_STATUS_READ_ONLY;
00128 _fileStream.seekg(0);
00129 readHeader();
00130 }
00131
00132
00133
00134
00135 void
00136 AbstractFile::openWONLY()
00137
00138 throw(QgarErrorIO)
00139
00140 {
00141 close();
00142
00143
00144
00145 _fileStream.clear();
00146 _fileStream.open(_fileName, std::ios::out | std::ios::trunc | std::ios::binary);
00147
00148 if (!_fileStream)
00149 {
00150 std::ostringstream os;
00151 os << "Cannot open output file: "
00152 << _fileName;
00153 throw QgarErrorIO(__FILE__, __LINE__,
00154 "void qgar::AbstractFile::openWONLY()",
00155 os.str());
00156 }
00157
00158 _fileStatus = QGE_FILE_STATUS_WRITE_ONLY;
00159 writeHeader();
00160 }
00161
00162
00163
00164
00165 void
00166 AbstractFile::openAPPEND()
00167
00168 throw(QgarErrorIO)
00169
00170 {
00171 close();
00172
00173
00174 _fileStream.clear();
00175
00176 _fileStream.open(_fileName, std::ios::app | std::ios::binary);
00177 if (!_fileStream)
00178 {
00179 std::ostringstream os;
00180 os << "Cannot open append file: "
00181 << _fileName;
00182 throw QgarErrorIO(__FILE__, __LINE__,
00183 "void qgar::AbstractFile::openAPPEND()",
00184 os.str());
00185 }
00186
00187 _fileStatus = QGE_FILE_STATUS_APPEND;
00188 _fileStream.seekg(0);
00189 readHeader();
00190 _fileStream.seekg(0, std::ios::end);
00191 }
00192
00193
00194
00195
00196 void
00197 AbstractFile::openRW()
00198
00199 throw(QgarErrorIO)
00200
00201 {
00202 close();
00203 _fileStream.open(_fileName, std::ios::in | std::ios::out | std::ios::binary);
00204 if (!_fileStream)
00205 {
00206 std::ostringstream os;
00207 os << "Cannot open read/write file: "
00208 << _fileName;
00209 throw QgarErrorIO(__FILE__, __LINE__,
00210 "void qgar::AbstractFile::openRW()",
00211 os.str());
00212 }
00213
00214 _fileStatus = QGE_FILE_STATUS_READ_WRITE;
00215 _fileStream.seekg(0);
00216 writeHeader();
00217 }
00218
00219
00220
00221
00222 void
00223 AbstractFile::openRA()
00224
00225 throw(QgarErrorIO)
00226
00227 {
00228 close();
00229 _fileStream.open(_fileName, std::ios::in | std::ios::app | std::ios::binary);
00230
00231 if (!_fileStream)
00232 {
00233 std::ostringstream os;
00234 os << "Cannot open read/append file: "
00235 << _fileName;
00236 throw QgarErrorIO(__FILE__, __LINE__,
00237 "void qgar::AbstractFile::openRA()",
00238 os.str());
00239 }
00240
00241 _fileStatus = QGE_FILE_STATUS_READ_APPEND;
00242 _fileStream.seekg(0);
00243 readHeader();
00244 _fileStream.seekg(0, std::ios::end);
00245 }
00246
00247
00248
00249
00250 void
00251 AbstractFile::close()
00252 {
00253 if (_fileStatus != QGE_FILE_STATUS_CLOSED)
00254 {
00255 if ( (_fileStatus == QGE_FILE_STATUS_WRITE_ONLY)
00256 || (_fileStatus == QGE_FILE_STATUS_READ_WRITE))
00257 {
00258 writeFooter();
00259 }
00260
00261 _fileStream.close();
00262 _fileStatus = QGE_FILE_STATUS_CLOSED;
00263 }
00264 }
00265
00266
00267
00268
00269
00270
00271
00272 void
00273 AbstractFile::isOpenR()
00274
00275 throw(QgarErrorUser)
00276
00277 {
00278 if ( (_fileStatus == QGE_FILE_STATUS_WRITE_ONLY)
00279 || (_fileStatus == QGE_FILE_STATUS_APPEND))
00280 {
00281 std::ostringstream os;
00282 os << "File not open in read mode: "
00283 << _fileName;
00284 throw QgarErrorUser(__FILE__, __LINE__,
00285 "void qgar::AbstractFile::isOpenR()",
00286 os.str());
00287 }
00288 }
00289
00290
00291 void
00292 AbstractFile::isOpenW()
00293
00294 throw(QgarErrorUser)
00295
00296 {
00297 if (_fileStatus == QGE_FILE_STATUS_READ_ONLY)
00298 {
00299 std::ostringstream os;
00300 os << "File not open in write mode: "
00301 << _fileName;
00302 throw QgarErrorUser(__FILE__, __LINE__,
00303 "void qgar::AbstractFile::isOpenW()",
00304 os.str());
00305 }
00306 }
00307
00308
00309 void
00310 AbstractFile::isOpenA()
00311
00312 throw(QgarErrorUser)
00313
00314 {
00315 if ( (_fileStatus != QGE_FILE_STATUS_APPEND)
00316 && (_fileStatus != QGE_FILE_STATUS_READ_APPEND))
00317 {
00318 std::ostringstream os;
00319 os << "File not open in append mode: "
00320 << _fileName;
00321 throw QgarErrorUser(__FILE__, __LINE__,
00322 "void qgar::AbstractFile::isOpenA()",
00323 os.str());
00324 }
00325 }
00326
00327
00328 void
00329 AbstractFile::isOpenRW()
00330
00331 throw(QgarErrorUser)
00332
00333 {
00334 if (_fileStatus != QGE_FILE_STATUS_READ_WRITE)
00335 {
00336 std::ostringstream os;
00337 os << "File not open in read/write mode: "
00338 << _fileName;
00339 throw QgarErrorUser(__FILE__, __LINE__,
00340 "void qgar::AbstractFile::isOpenRW()",
00341 os.str());
00342 }
00343 }
00344
00345
00346 void
00347 AbstractFile::isOpenRA()
00348
00349 throw(QgarErrorUser)
00350
00351 {
00352 if (_fileStatus != QGE_FILE_STATUS_READ_APPEND)
00353 {
00354 std::ostringstream os;
00355 os << "File not open in read/append mode: "
00356 << _fileName;
00357 throw QgarErrorUser(__FILE__, __LINE__,
00358 "void qgar::AbstractFile::isOpenRA()",
00359 os.str());
00360 }
00361 }
00362
00363
00364
00365 }