//make sure that this header file is only loaded once #ifndef RTS_BINARY_H #define RTS_BINARY_H #include "../envi/envi_header.h" #include "../math/vector.h" #include #include namespace stim{ //This class contains a bunch of functions useful for multidimensional binary file access template< typename T, unsigned int D = 3 > class binary{ protected: std::fstream file; //file stream used for reading and writing std::string name; //file name unsigned int R[D]; //resolution unsigned int header; //header size (in bytes) unsigned char* mask; //pointer to a character array: 0 = background, 1 = foreground (or valid data) //basic initialization void init(){ memset(R, 0, sizeof(unsigned int) * D); //initialize the resolution to zero header = 0; //initialize the header size to zero mask = NULL; } //returns the file size // reads the file size from disk and returns it (in bytes) unsigned int get_file_size(){ struct stat results; if(stat(name.c_str(), &results) == 0) return results.st_size; else return 0; } //make sure that the specified file size matches the file size on disk // returns true/false bool test_file_size(){ unsigned int npts = 1; //initialize the number of data points to 1 for(unsigned int i = 0; i r, unsigned int h = 0){ for(unsigned int i = 0; i < D; i++) //set the dimensions of the binary file object R[i] = r[i]; header = h; //save the header size if(!open_file(filename)) return false; //open the binary file return test_file_size(); } //crete a new binary file bool create(std::string filename, vec r, unsigned int offset = 0){ std::ofstream target(filename.c_str(), std::ios::binary); //initialize binary file T p = 0; for(unsigned int i =0; i < r[0] * r[1] * r[2]; i++){ target.write((char*)(&p), sizeof(T)); } for(unsigned int i = 0; i < D; i++) //set the dimensions of the binary file object R[i] = r[i]; header = offset; //save the header size if(!open_file(filename)) return false; //open the binary file return test_file_size(); } //save one band from the memory to the file bool writeZ( T * p, unsigned int page){ if(p == NULL){ std::cout<<"ERROR: unable to write into file, empty pointer"<= R[2]){ //make sure the bank number is right std::cout<<"ERROR: page out of range"<= R[0] || y >= R[1]){ //make sure the sample and line number is right std::cout<<"ERROR: sample or line out of range"<(X), h); } bool open(std::string filename, unsigned int X, unsigned int Y, unsigned int h = 0){ return open(filename, vec(X, Y), h); } bool open(std::string filename, unsigned int X, unsigned int Y, unsigned int Z, unsigned int h = 0){ return open(filename, vec(X, Y, Z), h); }*/ }; } #endif