1f2ca8ec
David Mayerich
added files for b...
|
1
2
|
//make sure that this header file is only loaded once
|
180d7f3a
David Mayerich
added binary file...
|
3
4
5
6
|
#ifndef RTS_BINARY_H
#define RTS_BINARY_H
#include "../envi/envi.h"
|
4dcc9392
heziqi
Ziqi's first chan...
|
7
|
#include "../math/vector.h"
|
180d7f3a
David Mayerich
added binary file...
|
8
9
10
11
12
13
14
15
16
17
|
#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:
|
180d7f3a
David Mayerich
added binary file...
|
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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...
|
32
|
// reads the file size from disk and returns it (in bytes)
|
180d7f3a
David Mayerich
added binary file...
|
33
34
35
36
37
38
39
40
|
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...
|
41
42
|
//make sure that the specified file size matches the file size on disk
// returns true/false
|
180d7f3a
David Mayerich
added binary file...
|
43
|
bool test_file_size(){
|
87da9adc
David Mayerich
fixed issues with...
|
44
45
46
47
48
49
|
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...
|
50
51
52
53
|
else return false; //otherwise return an error
}
|
3725ee1d
David Mayerich
simplify modifica...
|
54
|
//open the file specified in "name" for binary reading and writing
|
180d7f3a
David Mayerich
added binary file...
|
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
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...
|
71
|
//open a file, given the file name, resolution (as a vector) and header size
|
180d7f3a
David Mayerich
added binary file...
|
72
|
bool open(std::string filename, vec<unsigned int, D> r, unsigned int h = 0){
|
180d7f3a
David Mayerich
added binary file...
|
73
|
|
87da9adc
David Mayerich
fixed issues with...
|
74
|
for(unsigned int i = 0; i < D; i++) //set the dimensions of the binary file object
|
180d7f3a
David Mayerich
added binary file...
|
75
76
|
R[i] = r[i];
|
87da9adc
David Mayerich
fixed issues with...
|
77
78
79
|
header = h; //save the header size
if(!open_file(filename)) return false; //open the binary file
|
180d7f3a
David Mayerich
added binary file...
|
80
81
82
83
|
return test_file_size();
}
|
5d5ce39a
heziqi
Ziqi convert the ...
|
84
85
|
//save one band of the file into the memory, and return the pointer
bool saveZ( T * p, unsigned int page){
|
c7da85e3
heziqi
he,ziqi add metho...
|
86
|
|
5d5ce39a
heziqi
Ziqi convert the ...
|
87
|
if (page >= R[2]){ //make sure the bank number is right
|
2ad0ce4f
David Mayerich
syntactic edits b...
|
88
|
std::cout<<"ERROR: page out of range"<<std::endl;
|
5d5ce39a
heziqi
Ziqi convert the ...
|
89
|
return false;
|
c7da85e3
heziqi
he,ziqi add metho...
|
90
91
|
}
|
3b972fb3
David Mayerich
wrote a general f...
|
92
|
file.seekg(R[1] * R[0] * page * sizeof(T), std::ios::beg); //write into memory from the binary file
|
2ad0ce4f
David Mayerich
syntactic edits b...
|
93
|
file.read((char *)p, R[0] * R[1] * sizeof(T));
|
c7da85e3
heziqi
he,ziqi add metho...
|
94
|
|
5d5ce39a
heziqi
Ziqi convert the ...
|
95
|
return true;
|
c7da85e3
heziqi
he,ziqi add metho...
|
96
97
|
}
|
3b972fb3
David Mayerich
wrote a general f...
|
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
//saves a hyperplane orthogonal to dimension d at intersection n
bool getSlice(T * dest, unsigned int d, unsigned int n){
//reset the file pointer back to the beginning of the file
file.seekg(0, std::ios::beg);
//compute the contiguous size C for each readable block
unsigned int C = 1;
for(unsigned int i = 0; i < d; i++) //for each dimension less than d
C *= R[i]; //compute the product
//compute the non-contiguous size NC for each readable block
unsigned int NC = 1;
for(unsigned int i = d + 1; i < D; i++)
NC *= R[i];
//for all noncontiguous blocks, read each contiguous block that makes up the hyper-plane
for(unsigned int nc = 0; nc < NC; nc++){
file.seekg(n * C * sizeof(T), std::ios::cur); //skip n contiguous blocks
file.read( (char*)&dest[nc * C], C * sizeof(T)); //read one contiguous block
file.seekg( (R[d] - n - 1) * C * sizeof(T), std::ios::cur); //skip R[d] - n contiguous blocks
}
return true;
}
|
5d5ce39a
heziqi
Ziqi convert the ...
|
125
126
|
//save one pixel of the file into the memory, and return the pointer
bool saveXY(T * p, unsigned x, unsigned y){
|
c7da85e3
heziqi
he,ziqi add metho...
|
127
|
|
c7da85e3
heziqi
he,ziqi add metho...
|
128
129
|
unsigned int i;
|
5d5ce39a
heziqi
Ziqi convert the ...
|
130
131
132
|
if ( x >= R[0] || y >= R[1]){ //make sure the sample and line number is right
std::cout<<"ERROR: sample or line out of range"<<std::endl;
return false;
|
51f94485
heziqi
Ziqi added saveZ,...
|
133
134
|
}
|
3b972fb3
David Mayerich
wrote a general f...
|
135
|
file.seekg((x + y * R[0]) * sizeof(T), std::ios::beg); //point to the certain sample and line
|
5d5ce39a
heziqi
Ziqi convert the ...
|
136
|
for (i = 0; i < R[2]; i++)
|
c7da85e3
heziqi
he,ziqi add metho...
|
137
|
{
|
5d5ce39a
heziqi
Ziqi convert the ...
|
138
|
file.read((char *)(p + i), sizeof(T));
|
3b972fb3
David Mayerich
wrote a general f...
|
139
|
file.seekg((R[1] * R[0] - 1) * sizeof(T), std::ios::cur); //go to the next band
|
c7da85e3
heziqi
he,ziqi add metho...
|
140
141
|
}
|
5d5ce39a
heziqi
Ziqi convert the ...
|
142
|
return true;
|
c7da85e3
heziqi
he,ziqi add metho...
|
143
144
|
}
|
3725ee1d
David Mayerich
simplify modifica...
|
145
|
/*bool open(std::string filename, unsigned int X, unsigned int h = 0){
|
180d7f3a
David Mayerich
added binary file...
|
146
147
148
149
150
|
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...
|
151
152
153
154
|
}
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...
|
155
|
}*/
|
180d7f3a
David Mayerich
added binary file...
|
156
157
158
159
160
161
|
};
}
#endif
|