180d7f3a
David Mayerich
added binary file...
|
1
2
3
4
|
#ifndef RTS_BINARY_H
#define RTS_BINARY_H
#include "../envi/envi.h"
|
4dcc9392
heziqi
Ziqi's first chan...
|
5
|
#include "../math/vector.h"
|
180d7f3a
David Mayerich
added binary file...
|
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#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
|
3725ee1d
David Mayerich
simplify modifica...
|
31
|
// reads the file size from disk and returns it (in bytes)
|
180d7f3a
David Mayerich
added binary file...
|
32
33
34
35
36
37
38
39
|
unsigned int get_file_size(){
struct stat results;
if(stat(name.c_str(), &results) == 0)
return results.st_size;
else return 0;
}
|
3725ee1d
David Mayerich
simplify modifica...
|
40
41
|
//make sure that the specified file size matches the file size on disk
// returns true/false
|
180d7f3a
David Mayerich
added binary file...
|
42
|
bool test_file_size(){
|
87da9adc
David Mayerich
fixed issues with...
|
43
44
45
46
47
48
|
unsigned int npts = 1; //initialize the number of data points to 1
for(unsigned int i = 0; i<D; i++) //iterate over each dimension
npts *= R[i]; //compute the total number of data points in the file
unsigned int datasize = npts * sizeof(T);//multiply the sum by the size of the template parameter
if(datasize + header == get_file_size()) return true; //if the byte size matches the file size, we're golden
|
180d7f3a
David Mayerich
added binary file...
|
49
50
51
52
|
else return false; //otherwise return an error
}
|
3725ee1d
David Mayerich
simplify modifica...
|
53
|
//open the file specified in "name" for binary reading and writing
|
180d7f3a
David Mayerich
added binary file...
|
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
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:
|
3725ee1d
David Mayerich
simplify modifica...
|
70
|
//open a file, given the file name, resolution (as a vector) and header size
|
180d7f3a
David Mayerich
added binary file...
|
71
|
bool open(std::string filename, vec<unsigned int, D> r, unsigned int h = 0){
|
180d7f3a
David Mayerich
added binary file...
|
72
|
|
87da9adc
David Mayerich
fixed issues with...
|
73
|
for(unsigned int i = 0; i < D; i++) //set the dimensions of the binary file object
|
180d7f3a
David Mayerich
added binary file...
|
74
75
|
R[i] = r[i];
|
87da9adc
David Mayerich
fixed issues with...
|
76
77
78
|
header = h; //save the header size
if(!open_file(filename)) return false; //open the binary file
|
180d7f3a
David Mayerich
added binary file...
|
79
80
81
82
|
return test_file_size();
}
|
3725ee1d
David Mayerich
simplify modifica...
|
83
|
/*bool open(std::string filename, unsigned int X, unsigned int h = 0){
|
180d7f3a
David Mayerich
added binary file...
|
84
85
86
87
88
|
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);
|
180d7f3a
David Mayerich
added binary file...
|
89
90
91
92
|
}
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);
|
3725ee1d
David Mayerich
simplify modifica...
|
93
|
}*/
|
180d7f3a
David Mayerich
added binary file...
|
94
95
96
97
98
99
|
};
}
#endif
|