-
Notifications
You must be signed in to change notification settings - Fork 0
/
filAdder.cpp
213 lines (177 loc) · 6.75 KB
/
filAdder.cpp
1
2
3
4
5
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <fstream>
// External function to print help if needed
void usage() {
std::cout << std::endl << "Usage: filAdder filFile1 filFile2 filFile3..." << std::endl << std::endl;
}
/* -- filAdder -------------------------------------
** Adds together as many fil files as you give it. |
------------------------------------------------- */
int main(int argc, char *argv[]) {
int nchar = sizeof(int), numChans = 0, numBits = 0, numIFs = 0, machineID, telescopeID, dataType, numSamps = 0;
double obsStart, sampTime, fCh1, fOff;
char *buffer, string[80];
std::ifstream infile;
std::ofstream outfile;
if (argc < 3) {
std::cerr << std::endl << "You must at least list two files to add!" << std::endl;
usage();
exit(0);
}
// Open output .fil file to write
outfile.open("combined.fil", std::ofstream::binary);
if (!outfile.is_open()) {
std::cerr << "Could not open output file combined.fil to write!" << std::endl << std::endl;
exit(0);
}
// Open first .fil file to read
infile.open(argv[1], std::ifstream::binary | std::ifstream::ate);
if (!infile.is_open()) {
std::cerr << "Could not open file " << argv[1] << " to read!" << std::endl << std::endl;
exit(0);
}
std::cout << "Reading " << argv[1] << "..." << std::endl;
// Since we opened the file at the end, report the size of the file
const size_t fileSize = infile.tellg();
// Seek back to the beginning of the file
infile.seekg(0, infile.beg);
// Allocate memory to store the entire .fil file
buffer = (char*) malloc(sizeof(char) * fileSize);
// Read the entire file into the malloc'd buffer
infile.read(buffer, fileSize);
// Close the file
infile.close();
// Write the entire first file to the output file
outfile.write(buffer, fileSize);
// Delete the malloc'd buffer
free(buffer);
// For the remaining files, get the data and append them to the output file
for (int i = 2; i < argc; i++) {
// Open next .fil file to read
infile.open(argv[i], std::ifstream::binary);
if (!infile.is_open()) {
std::cerr << "Could not open file " << argv[i] << " to read!" << std::endl << std::endl;
exit(0);
}
std::cout << "Reading " << argv[i] << "..." << std::endl;
// Read header parameters until "HEADER_END" is encountered
while (true) {
// Read string size
strcpy(string, "ERROR");
infile.read((char*) &nchar, sizeof(int));
if (!infile) {
std::cerr << "Error reading header string size!" << std::endl << std::endl;
exit(0);
}
// Skip wrong strings
if (!(nchar > 1 && nchar < 80)) {
continue;
}
// Read string
infile.read((char*) string, nchar);
if (!infile) {
std::cerr << "Could not read header string!" << std::endl << std::endl;
exit(0);
}
string[nchar] = '\0';
// Exit at end of header
if (strcmp(string, "HEADER_END") == 0) {
break;
}
// Read parameters
if (strcmp(string, "tsamp") == 0) {
infile.read((char*) &sampTime, sizeof(double));
if (!infile) {
std::cerr << "Did not read header parameter 'tsamp' properly!" << std::endl << std::endl;
exit(0);
}
} else if (strcmp(string, "tstart") == 0) {
infile.read((char*) &obsStart, sizeof(double));
if (!infile) {
std::cerr << "Did not read header parameter 'tstart' properly!" << std::endl << std::endl;
exit(0);
}
} else if (strcmp(string, "fch1") == 0) {
infile.read((char*) &fCh1, sizeof(double));
if (!infile) {
std::cerr << "Did not read header parameter 'fch1' properly!" << std::endl << std::endl;
exit(0);
}
} else if (strcmp(string, "foff") == 0) {
infile.read((char*) &fOff, sizeof(double));
if (!infile) {
std::cerr << "Did not read header parameter 'foff' properly!" << std::endl << std::endl;
exit(0);
}
} else if (strcmp(string, "nchans") == 0) {
infile.read((char*) &numChans, sizeof(int));
if (!infile) {
std::cerr << "Did not read header parameter 'nchans' properly!" << std::endl << std::endl;
exit(0);
}
} else if (strcmp(string, "nifs") == 0) {
infile.read((char*) &numIFs, sizeof(int));
if (!infile) {
std::cerr << "Did not read header parameter 'nifs' properly!" << std::endl << std::endl;
exit(0);
}
} else if (strcmp(string, "nbits") == 0 ) {
infile.read((char*) &numBits, sizeof(int));
if (!infile) {
std::cerr << "Did not read header parameter 'nbits' properly!" << std::endl << std::endl;
exit(0);
}
} else if (strcmp(string, "nsamples") == 0) {
infile.read((char*) &numSamps, sizeof(int));
if (!infile) {
std::cerr << "Did not read header parameter 'nsamples' properly!" << std::endl << std::endl;
exit(0);
}
} else if (strcmp(string, "machine_id") == 0) {
infile.read((char*) &machineID, sizeof(int));
if (!infile) {
std::cerr << "Did not read header parameter 'machine_id' properly!" << std::endl << std::endl;
exit(0);
}
} else if (strcmp(string, "telescope_id") == 0) {
infile.read((char*) &telescopeID, sizeof(int));
if (!infile) {
std::cerr << "Did not read header parameter 'telescope_id' properly!" << std::endl << std::endl;
exit(0);
}
} else if (strcmp(string, "data_type") == 0) {
infile.read((char*) &dataType, sizeof(int));
if (!infile) {
std::cerr << "Did not read header parameter 'data_type' properly!" << std::endl << std::endl;
exit(0);
}
} else {
std::cerr << "Unknown header parameter " << string << std::endl;
}
}
// Get the size of the header from the current position of the file pointer
const size_t headerSize = infile.tellg();
// Seek to the end of the file
infile.seekg(0, infile.end);
// Get the size of the data based on the difference of the total file size and the header size
const size_t bufferSize = infile.tellg() - headerSize;
// Seek back to the end of the header
infile.seekg(headerSize, infile.beg);
// Allocate memory to store data from file
buffer = (char*) malloc(sizeof(char) * bufferSize);
// Read all data from the file into malloc'd buffer
infile.read((char*) buffer, bufferSize);
// Close file
infile.close();
// Write the file's data to the output file
outfile.write(buffer, bufferSize);
// Delete the malloc'd buffer
free(buffer);
}
// Close the output file
outfile.close();
}