00001 #ifndef SCT_FILE_OSTREAMFILE2_H
00002 #define SCT_FILE_OSTREAMFILE2_H
00003
00004 #include "../OStream.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::fwrite;
00014 using std::ftell;
00015 using std::strlen;
00016 using std::string;
00017
00018 namespace Sct {
00019 namespace File {
00020
00021 template<typename T>
00022 void write(FILE* f, T t);
00023
00024 template<typename T>
00025 void writeArray(FILE* f, const T* t, size_t size);
00026
00027 class OStreamFile2 : public virtual OStream {
00028 public:
00029 OStreamFile2(const string& fileName) : file(0) {
00030 file = fopen(fileName.c_str(), "wb");
00031 if (!file) {
00032 throw FileException(fileName, "Couldn't open file", __FILE__, __LINE__);
00033 }
00034 }
00035
00036 virtual ~OStreamFile2() {
00037 if (file) {
00038 fclose(file);
00039 }
00040 }
00041
00042 virtual OStream & operator<<(bool val) {
00043 write(file, val);
00044 return *this;
00045 }
00046
00047 virtual OStream & operator<<(char val) {
00048 write(file, val);
00049 return *this;
00050 }
00051
00052 virtual OStream & operator<<(unsigned char val) {
00053 write(file, val);
00054 return *this;
00055 }
00056
00057 virtual OStream & operator<<(short val) {
00058 write(file, val);
00059 return *this;
00060 }
00061
00062 virtual OStream & operator<<(unsigned short val){
00063 write(file, val);
00064 return *this;
00065 }
00066
00067 virtual OStream & operator<<(int val) {
00068 write(file, val);
00069 return *this;
00070 }
00071
00072 virtual OStream & operator<<(unsigned int val) {
00073 write(file, val);
00074 return *this;
00075 }
00076
00077 virtual OStream & operator<<(long val) {
00078 write(file, val);
00079 return *this;
00080 }
00081
00082 virtual OStream & operator<<(unsigned long val) {
00083 write(file, val);
00084 return *this;
00085 }
00086
00087 virtual OStream & operator<<(double val) {
00088 write(file, val);
00089 return *this;
00090 }
00091
00092 virtual OStream & operator<<(float val) {
00093 write(file, val);
00094 return *this;
00095 }
00096
00097 virtual OStream & operator<<(const std::string & val) {
00098 *this << val.c_str();
00099 return *this;
00100 }
00101
00102
00103
00104
00105 virtual OStream & operator<<(const char * str) {
00106 writeArray(file, str, strlen(str)+1);
00107 return *this;
00108 }
00109
00110 virtual OStream & operator<<(const unsigned char * str) {
00111 writeArray(file, str, strlen((char*)str)+1);
00112 return *this;
00113 }
00114
00115 virtual OStream & put(const bool* p, size_t size) {
00116 writeArray(file, p, size);
00117 return *this;
00118 }
00119
00120 virtual OStream & put(const char* p, size_t size) {
00121 writeArray(file, p, size);
00122 return *this;
00123 }
00124
00125 virtual OStream & put(const unsigned char* p, size_t size) {
00126 writeArray(file, p, size);
00127 return *this;
00128 }
00129
00130 virtual OStream & put(const short* p, size_t size) {
00131 writeArray(file, p, size);
00132 return *this;
00133 }
00134
00135 virtual OStream & put(const unsigned short* p, size_t size) {
00136 writeArray(file, p, size);
00137 return *this;
00138 }
00139
00140 virtual OStream & put(const int* p, size_t size) {
00141 writeArray(file, p, size);
00142 return *this;
00143 }
00144
00145 virtual OStream & put(const unsigned int* p, size_t size) {
00146 writeArray(file, p, size);
00147 return *this;
00148 }
00149
00150 virtual OStream & put(const long* p, size_t size) {
00151 writeArray(file, p, size);
00152 return *this;
00153 }
00154
00155 virtual OStream & put(const unsigned long* p, size_t size) {
00156 writeArray(file, p, size);
00157 return *this;
00158 }
00159
00160 virtual OStream & put(const float* p, size_t size) {
00161 writeArray(file, p, size);
00162 return *this;
00163 }
00164
00165 virtual OStream & put(const double* p, size_t size) {
00166 writeArray(file, p, size);
00167 return *this;
00168 }
00169
00170 virtual OStream & put(const std::string* p, size_t size) {
00171 writeArray(file, p, size);
00172 return *this;
00173 }
00174
00175
00176
00177
00178 private:
00179 FILE* file;
00180 };
00181
00182 template<typename T>
00183 void write(FILE* f, T t) {
00184 fwrite(&t, sizeof(T), 1, f);
00185 }
00186
00187 template<typename T>
00188 void writeArray(FILE* f, const T* t, size_t size) {
00189
00190 write(f, size);
00191 fwrite(t, sizeof(T), size, f);
00192 }
00193
00194
00195 }
00196 }
00197 #endif //SCT_FILE_OSTREAMFILE2_H