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
|
}
|
5d5ce39a
heziqi
Ziqi convert the ...
|
92
|
file.seekg(R[1] * R[0] * page * sizeof(T), 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
|
}
|
5d5ce39a
heziqi
Ziqi convert the ...
|
98
99
|
//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...
|
100
|
|
c7da85e3
heziqi
he,ziqi add metho...
|
101
102
|
unsigned int i;
|
5d5ce39a
heziqi
Ziqi convert the ...
|
103
104
105
|
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,...
|
106
107
|
}
|
5d5ce39a
heziqi
Ziqi convert the ...
|
108
109
|
file.seekg((x + y * R[0]) * sizeof(T), ios::beg); //point to the certain sample and line
for (i = 0; i < R[2]; i++)
|
c7da85e3
heziqi
he,ziqi add metho...
|
110
|
{
|
5d5ce39a
heziqi
Ziqi convert the ...
|
111
112
|
file.read((char *)(p + i), sizeof(T));
file.seekg((R[1] * R[0] - 1) * sizeof(T), ios::cur); //go to the next band
|
c7da85e3
heziqi
he,ziqi add metho...
|
113
114
|
}
|
5d5ce39a
heziqi
Ziqi convert the ...
|
115
|
return true;
|
c7da85e3
heziqi
he,ziqi add metho...
|
116
117
|
}
|
3725ee1d
David Mayerich
simplify modifica...
|
118
|
/*bool open(std::string filename, unsigned int X, unsigned int h = 0){
|
180d7f3a
David Mayerich
added binary file...
|
119
120
121
122
123
|
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...
|
124
125
126
127
|
}
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...
|
128
|
}*/
|
180d7f3a
David Mayerich
added binary file...
|
129
130
131
132
133
134
|
};
}
#endif
|