FACT++  1.0
RowChecker.cc
Go to the documentation of this file.
1 /*
2  * RowChecker.cc
3  *
4  * Created on: Dec 20, 2011
5  * Author: lyard
6  */
7 
8 #include <fstream>
9 #include <cstdlib>
10 #include <iostream>
11 #include <cstring>
12 #include <sstream>
13 
14 using namespace std;
15 
16 
17 //usage RowChecker <name of file> <size of header> <size of line> <mjdref> <givenLines>
18 int main(int argc, char** argv)
19 {
20 
21  if (argc < 6)
22  return 0;
23 
24  fstream file(argv[1]);
25 
26  int headLen = atoi(argv[2]);
27  int lineWidth = atoi(argv[3]);
28  double mjdRef = atof(argv[4]);
29  int numLines = atoi(argv[5]);
30 
31  int totalBytes = headLen;
32  file.seekp(headLen);
33 
34  char* buf = new char[lineWidth];
35 
36  double currentTime = 0;
37  char timeBuf[16];
38  int realNumRows = 0;
39 
40  while (file.read(buf, lineWidth))
41  {
42  timeBuf[0] = buf[7];
43  timeBuf[1] = buf[6];
44  timeBuf[2] = buf[5];
45  timeBuf[3] = buf[4];
46  timeBuf[4] = buf[3];
47  timeBuf[5] = buf[2];
48  timeBuf[6] = buf[1];
49  timeBuf[7] = buf[0];
50  currentTime = reinterpret_cast<double*>(timeBuf)[0];
51 
52  if (realNumRows >= numLines)
53  {
54  if (currentTime + mjdRef > 60000 || currentTime + mjdRef < 10000)
55  break;
56  if (currentTime + mjdRef > 20000 && currentTime + mjdRef < 50000)
57  break;
58  }
59 //fix the time column if required.
60  if (currentTime > 50000 && currentTime < 60000)
61  {
62  currentTime -= 40587;
63  reinterpret_cast<double*>(timeBuf)[0] = currentTime;
64  file.seekp(totalBytes);
65  file.put(timeBuf[7]);
66  file.put(timeBuf[6]);
67  file.put(timeBuf[5]);
68  file.put(timeBuf[4]);
69  file.put(timeBuf[3]);
70  file.put(timeBuf[2]);
71  file.put(timeBuf[1]);
72  file.put(timeBuf[0]);
73  file.seekp(totalBytes + lineWidth);
74  }
75 
76  realNumRows++;
77  totalBytes += lineWidth;
78  }
79  //now update the number of lines of the file
80  file.close();
81  file.open(argv[1]);
82  file.seekp(2880);
83  delete[] buf;
84  buf = new char[81];
85  buf[80] = 0;
86  bool changeDone = false;
87  int seeked = 2880;
88  if (realNumRows == numLines)
89  changeDone = true;
90 
91  while (file.good() && !changeDone)
92  {
93  file.read(buf, 80);
94  string str(buf);
95 
96  if (str.substr(0,9) == "NAXIS2 =")
97  {
98  ostringstream ss;
99  ss << realNumRows;
100  file.seekp(seeked + 30 - ss.str().size());
101  for (int i=0;i<ss.str().size();i++)
102  file.put(ss.str()[i]);
103  changeDone = true;
104  break;
105  }
106  seeked += 80;
107  }
108  if (!changeDone)
109  cout << -1;
110  else
111  cout << realNumRows;
112  file.close();
113  return realNumRows;
114 }
int i
Definition: db_dim_client.c:21
char str[80]
Definition: test_client.c:7
STL namespace.
int main(int argc, char **argv)
Definition: RowChecker.cc:18