2010/04/06

[note] c++讀rinex星曆檔(未完成)

##ReadMore##

test2.txt
 6 99  9  2 17 51 44.0 -.839701388031D-03 -.165982783074D-10  .000000000000D+00
     .910000000000D+02  .934062500000D+02  .116040547840D-08  .162092304801D+00
     .484101474285D-05  .626740418375D-02  .652112066746D-05  .515365489006D+04
     .409904000000D+06 -.242143869400D-07  .329237003460D+00 -.596046447754D-07
     .111541663136D+01  .326593750000D+03  .206958726335D+01 -.638312302555D-08
     .307155651409D-09  .000000000000D+00  .102500000000D+04  .000000000000D+00
     .000000000000D+00  .000000000000D+00  .000000000000D+00  .910000000000D+02
     .406800000000D+06  .000000000000D+00
 6 99  9  2 17 51 44.0-0.839701388031D-03-0.165982783074D-10 0.000000000000D+00
    0.910000000000D+02 0.934062500000D+02 0.116040547840D-08 0.162092304801D+00
    0.484101474285D-05 0.626740418375D-02 0.652112066746D-05 0.515365489006D+04
    0.409904000000D+06-0.242143869400D-07 0.329237003460D+00-0.596046447754D-07
    0.111541663136D+01 0.326593750000D+03 0.206958726335D+01-0.638312302555D-08
    0.307155651409D-09 0.000000000000D+00 0.102500000000D+04 0.000000000000D+00
    0.000000000000D+00 0.000000000000D+00 0.000000000000D+00 0.910000000000D+02
    0.406800000000D+06 0.000000000000D+00


c++
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(void){
	
	ifstream fin;
	
	// open file
	fin.open("test2.txt", ios::in);
	
	// if file is open
	if(fin.is_open()){
		
		// ephemeris data
		int intPrn;
		int intYear, intMonth, intDay, intHr, intMin;
		float numSec;
		double numData[4];
		
		// count line (must start from -1)
		int intLine = -1;
		
		// if file can read
		while(!fin.eof()) {
			// count++
			intLine = (intLine<(8-1)) ? intLine+1 : 0;
			
			// line information
			string strLine;
			getline(fin, strLine);
			
			// save 4 string
			string strA, strB, strC, strD;
			strA = (strLine.size() > 0) ? strLine.substr(0,22) : "";
			strB = (strLine.size() > 22) ? strLine.substr(22,19) : "";
			strC = (strLine.size() > 41) ? strLine.substr(41,19) : "";
			strD = (strLine.size() > 60) ? strLine.substr(60,99) : "";
			
			if(intLine == 0){
				
				// use sscanf read prn and time tag
				sscanf(strA.c_str(), "%d %d %d %d %d %d %f", &intPrn, &intYear, &intMonth, &intDay, &intHr, &intMin, &numSec);
				//cout << intPrn << endl;
				//cout << "yy dd mm HH MM SS: " << intYear << " " << intMonth << " " << intDay << " " << intHr << " " << intMin << " " << numSec << endl;
				
				// tag line, save 3 data (from 1~3)
				numData[1] = strtod(strB.c_str(), NULL);
				numData[2] = strtod(strC.c_str(), NULL);
				numData[3] = strtod(strD.c_str(), NULL);
				
				// create char to save char
				char *chrLine;
				chrLine = new char[80+1];
				sprintf(chrLine, "%2d %2d %2d %2d %2d %2d %4.1f%+19.12E%+19.12E%+19.12E\n",
				 intPrn, intYear, intMonth, intDay, intHr, intMin, numSec,
				 numData[1], numData[2], numData[3]);
				
				// build string from char
				string strOut = chrLine;
				strOut.erase(79,1).erase(59,1).erase(39,1);
				cout << strOut << endl;
				
				
			}else{
				// not tag line, save 4 data (from 0~3)
				numData[0] = strtod(strA.c_str(), NULL);
				numData[1] = strtod(strB.c_str(), NULL);
				numData[2] = strtod(strC.c_str(), NULL);
				numData[3] = strtod(strD.c_str(), NULL);
				//cout << strLine.c_str()+3 << endl;
				
				// create char to save char
				char *chrLine;
				chrLine = new char[80+1];
				sprintf(chrLine, "%+19.12E%+19.12E%+19.12E%+19.12E\n", numData[0], numData[1], numData[2], numData[3]);
				
				// build string from char
				string strOut = chrLine;
				// force cut E+000 to E+00
				strOut.erase(78,1).erase(58,1).erase(38,1).erase(18,1);
				cout << "   " << strOut << endl;
			}
			
		}
	}
	fin.close();
	
	system("PAUSE");
	
	return 0;
	
}