Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __SIMPLEFILE_H__
00012 #define __SIMPLEFILE_H__
00013
00014 #include <shogun/io/SGIO.h>
00015 #include <shogun/base/SGObject.h>
00016
00017 #include <stdio.h>
00018 #include <string.h>
00019 #include <sys/mman.h>
00020
00021 namespace shogun
00022 {
00027 template <class T> class CSimpleFile : public CSGObject
00028 {
00029 public:
00031 CSimpleFile() :CSGObject(), line_buffer_size(1024*1024), line_buffer(NULL)
00032 {
00033 SG_UNSTABLE("CSimpleFile::CSimpleFile()", "\n");
00034
00035 file=NULL;
00036 filename=strdup("");
00037 status = false;
00038 }
00039
00046 CSimpleFile(char* fname, FILE* f)
00047 : CSGObject(), line_buffer_size(1024*1024), line_buffer(NULL)
00048 {
00049 file=f;
00050 filename=strdup(fname);
00051 status = (file!=NULL && filename!=NULL);
00052 }
00053
00054 virtual ~CSimpleFile()
00055 {
00056 SG_FREE(filename);
00057 free_line_buffer();
00058 }
00059
00066 T* load(T* target, int64_t& num)
00067 {
00068 if (status)
00069 {
00070 status=false;
00071
00072 if (num==0)
00073 {
00074 bool seek_status=true;
00075 int64_t cur_pos=ftell(file);
00076
00077 if (cur_pos!=-1)
00078 {
00079 if (!fseek(file, 0, SEEK_END))
00080 {
00081 if ((num=(int64_t) ftell(file)) != -1)
00082 {
00083 SG_INFO( "file of size %ld bytes == %ld entries detected\n", num,num/sizeof(T));
00084 num/=sizeof(T);
00085 }
00086 else
00087 seek_status=false;
00088 }
00089 else
00090 seek_status=false;
00091 }
00092
00093 if ((fseek(file,cur_pos, SEEK_SET)) == -1)
00094 seek_status=false;
00095
00096 if (!seek_status)
00097 {
00098 SG_ERROR( "filesize autodetection failed\n");
00099 num=0;
00100 return NULL;
00101 }
00102 }
00103
00104 if (num>0)
00105 {
00106 if (!target)
00107 target=SG_MALLOC(T, num);
00108
00109 if (target)
00110 {
00111 size_t num_read=fread((void*) target, sizeof(T), num, file);
00112 status=((int64_t) num_read == num);
00113
00114 if (!status)
00115 SG_ERROR( "only %ld of %ld entries read. io error\n", (int64_t) num_read, num);
00116 }
00117 else
00118 SG_ERROR( "failed to allocate memory while trying to read %ld entries from file \"s\"\n", (int64_t) num, filename);
00119 }
00120 return target;
00121 }
00122 else
00123 {
00124 num=-1;
00125 return NULL;
00126 }
00127 }
00128
00135 bool save(T* target, int64_t num)
00136 {
00137 if (status)
00138 {
00139 status=false;
00140 if (num>0)
00141 {
00142 if (!target)
00143 target=SG_MALLOC(T, num);
00144
00145 if (target)
00146 {
00147 status=(fwrite((void*) target, sizeof(T), num, file)==
00148 (size_t) num);
00149 }
00150 }
00151 }
00152 return status;
00153 }
00154
00160 void get_buffered_line(char* line, uint64_t len)
00161 {
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181 }
00182
00184 void free_line_buffer()
00185 {
00186 SG_FREE(line_buffer);
00187 line_buffer=NULL;
00188 }
00189
00194 inline void set_line_buffer_size(int32_t bufsize)
00195 {
00196 if (bufsize<=0)
00197 bufsize=1024*1024;
00198
00199 free_line_buffer();
00200 line_buffer_size=bufsize;
00201 }
00202
00207 inline bool is_ok() { return status; }
00208
00210 virtual const char* get_name() const { return "SimpleFile"; }
00211
00212 protected:
00214 FILE* file;
00216 bool status;
00218 char task;
00220 char* filename;
00221
00223 int32_t line_buffer_size;
00225 char* line_buffer;
00226 };
00227 }
00228 #endif