binary.h 2.46 KB
#ifndef RTS_BINARY_H
#define RTS_BINARY_H

#include "../envi/envi.h"

#include <fstream>
#include <sys/stat.h>

namespace rts{

//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)


	//basic initialization
	void init(){
		memset(R, 0, sizeof(unsigned int) * D);		//initialize the resolution to zero
		header = 0;									//initialize the header size to zero
	}

	//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 sum = header;			//initialize the sum (in bytes) to the header size
		for(unsigned int i = 0; i<D; i++)	//iterate over each dimension, summing the byte size
			sum += R[i] * sizeof(T);
		if(sum == get_file_size()) return true;	//if the byte size matches the file size, we're golden
		else return false;					//otherwise return an error

	}

	//open the file specified in "name" for binary reading and writing
	bool open_file(std::string filename){
		//open the file as binary for reading and writing
		file.open(filename.c_str(), std::ios::in | std::ios::out | std::ios::binary);

		//if the file is successful
		if(file){
			name = filename;		//set the name
			if(test_file_size())	//test the file size
				return true;
		}
		
		return false;
	}

public:

	//open a file, given the file name, resolution (as a vector) and header size
	bool open(std::string filename, vec<unsigned int, D> r, unsigned int h = 0){
		if(!open_file(filename)) return false;

		for(unsigned int i = 0; i < D; i++)
			R[i] = r[i];

		header = h;

		return test_file_size();
	}

	/*bool open(std::string filename, unsigned int X, unsigned int h = 0){
		return open(filename, vec<unsigned int, 1>(X), h);
	}

	bool open(std::string filename, unsigned int X, unsigned int Y, unsigned int h = 0){
		return open(filename, vec<unsigned int, 2>(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<unsigned int, 3>(X, Y, Z), h);
	}*/

};

}

#endif