The VisAO Camera
readcolumns.cpp
1 
2 
3 #include "readcolumns.h"
4 
5 int readcolumns(const char * fname, std::string delims, char comment, const char * format, ...)
6 {
7  va_list ap;
8 
9  int ** intptrptr;
10  double ** dblptrptr;
11  char tmpline[1024];
12  int pos, opos;
13  std::string argstr, tmpstr;
14 
15  std::ifstream fin;
16 
17  int nargs, nlines;
18 
19  nargs = strlen(format);
20 
21  fin.open(fname);
22 
23  //First figure out how many lines we have
24  nlines = 0;
25  while(!fin.eof())
26  {
27  fin.getline(tmpline, 1024);
28  //here test for delimiters
29  tmpstr = tmpline;
30  pos = tmpstr.find(comment,0);
31  opos = tmpstr.find_first_not_of(delims+comment, 0);
32  if(pos >=0)
33  {
34  if(opos == -1 || opos > pos) continue;
35  }
36  if(opos < 0) continue;
37 
38  nlines++;
39  }
40 
41  va_start(ap, format);
42 
43  for(int i = 0; i < nargs; i++)
44  {
45  switch(format[i])
46  {
47  case 'i':
48  intptrptr = va_arg(ap, int**);
49  (*intptrptr) = new int[nlines];
50  break;
51  case 'd':
52  dblptrptr = va_arg(ap, double **);
53  (*dblptrptr) = new double[nlines];
54  break;
55  default:
56  std::cerr << "Unrecognized format specifier in readcol\n";
57  return -1;
58  }
59  }
60 
61  va_end(ap);
62 
63  //fin.seekg(0);
64  fin.close();
65  fin.open(fname);
66 
67 
68 
69  delims += "\n";
70 
71  for(int i=0; i < nlines; i++)
72  {
73  fin.getline(tmpline, 1024);
74  tmpstr = tmpline;
75 
76  //First check for comments;
77  pos = tmpstr.find(comment,0);
78  opos = tmpstr.find_first_not_of(delims+comment, 0);
79  if(pos >=0)
80  {
81  if(opos == -1 || opos > pos)
82  {
83  i--;
84  continue;
85  }
86  }
87  if(opos < 0)
88  {
89  i--;
90  continue;
91  }
92  //Now find first argument
93 
94  opos = 0;
95 
96  va_start(ap, format);
97 
98  for(int j = 0; j < nargs; j++)
99  {
100  pos = tmpstr.find_first_of(delims+'\n', opos);
101 
102  if(pos == -1) pos = tmpstr.length();
103 
104  argstr = tmpstr.substr(opos, pos-opos);
105 
106 
107  opos = tmpstr.find_first_not_of(delims+'\n', pos+1);
108  if(opos == -1) opos = tmpstr.length();
109 
110 
111  switch(format[j])
112  {
113  case 'i':
114  intptrptr = va_arg(ap, int**);
115  (*intptrptr)[i] = atoi(argstr.c_str());
116  break;
117  case 'd':
118  dblptrptr = va_arg(ap, double **);
119  (*dblptrptr)[i] = strtod(argstr.c_str(), 0);
120  break;
121  default:
122  std::cerr << "Unrecognized format specifier in readcol\n";
123  return -1;
124  }
125 
126  }
127 
128  va_end(ap);
129  }
130  fin.close();
131 
132  return nlines;
133 }
134 
135 /*
136 int main()
137 {
138  int * i1, *i2;
139  double *d1, *d2, *d3;
140  int nlines;
141 
142  nlines = readcolumns("testcol.txt", " ,\t", '#', "ididd", &i1, &d1, &i2, &d2, &d3);
143 
144  std::cout << "nlines: " << nlines << "\n";
145 
146  for(int j=0; j<nlines;j++)
147  {
148  std::cout << i1[j] << " " << d1[j] << " " << i2[j] << " " << d2[j] << " " << d3[j] << "\n";
149  }
150 
151  delete[] i1;
152  delete[] i2;
153  delete[] d1;
154  delete[] d2;
155  delete[] d3;
156 
157  return 0;
158 }
159 
160 */
161 
162