7-1. 换个格式输出整数 (15)

本文介绍了一个简单的程序设计案例,该程序能够将一个不超过三位的正整数转换为一种特定的格式,通过使用‘B’代表百位、‘S’代表十位及个位数字的方式进行输出。
让我们用字母B来表示“百”、字母S表示“十”,用“12...n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。

输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000)。

输出格式:每个测试用例的输出占一行,用规定的格式输出n。

输入样例1:
234
输出样例1:
BBSSS1234
输入样例2:
23
输出样例2:
SS123
程序:
#include 
#include 
int main(void) {	
	int i, len, n, temp, bit, count = 0;
	scanf("%d", &n);			/* 读取整数 */ 
	temp = n;
	while(temp > 0) {			/* 计算整数的位数 */ 
		++count;
		temp /= 10;
	}
	while(count >= 1) {
		/* 分离整数的数字 */ 
		bit = (n / (int)pow(10, count - 1)) % 10;
		if(count == 3)
			for(i = 0; i < bit; ++i)		
				printf("B");
		if(count == 2)
			for(i = 0; i < bit; ++i)
				printf("S");
		if(count == 1)
			for(i = 1; i <= bit; ++i)
				printf("%d", i);
		--count;
	}
	printf("\n");
	return 0;
}
3.04 N: GNSS NAV DATA M: MIXED RINEX VERSION / TYPEO MergeMNfile.tcl IGS 20220905 113505 GMT PGM / RUN BY / DATE GAL 5.2000D+01 2.5000D-01 1.8250D-02 IONOSPHERIC CORR GPSA 1.3039D-08 2.2352D-08 -5.9605D-08 -1.1921D-07 IONOSPHERIC CORR GPSB 1.0445D+05 9.8304D+04 -1.3107D+05 -3.2768D+05 INOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 02 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 05 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 O 06 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 07 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 08 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 Q 09 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 10 IONOSPHERIC CORR BDSA 1.9558D-08 1.4901D-07 -1.2517D-06 1.9073D-06 N 11 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 X 12 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 13 IONOSPHERIC CORR BDSA 1.8626D-08 1.4156D-07 -1.1921D-06 1.8477D-06 R 14 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 O 16 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 Q 19 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 O 20 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 U 21 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 S 22 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 X 23 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 24 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 25 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 26 IONOSPHERIC CORR BDSA 1.8626D-08 1.4156D-07 -1.1921D-06 1.8477D-06 I 27 IONOSPHERIC CORR BDSA 1.9558D-08 1.4901D-07 -1.2517D-06 1.9073D-06 G 28 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 29 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 U 30 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 32 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 33 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 34 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 35 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 S 36 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 O 37 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 38 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 M 39 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 U 40 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 41 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 U 42 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 X 43 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 44 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 U 45 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 Q 46 IONOSPHERIC CORR BDSA 1.9558D-08 1.2666D-07 -1.1325D-06 1.7881D-06 W 60 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 02 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 05 IONOSPHERIC CORR BDSB 1.5565D+05 -7.8643D+05 4.7186D+06 -3.3423D+06 O 06 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 07 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 08 IONOSPHERIC CORR BDSB 1.5565D+05 -7.7005D+05 4.6531D+06 -3.2768D+06 Q 09 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 10 IONOSPHERIC CORR BDSB 1.4950D+05 -7.0451D+05 4.4564D+06 -3.1457D+06 N 11 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 X 12 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 13 IONOSPHERIC CORR BDSB 1.5155D+05 -7.2090D+05 4.4564D+06 -3.1457D+06 R 14 IONOSPHERIC CORR BDSB 1.5565D+05 -7.8643D+05 4.7186D+06 -3.3423D+06 O 16 IONOSPHERIC CORR BDSB 1.5565D+05 -7.7005D+05 4.6531D+06 -3.2768D+06 Q 19 IONOSPHERIC CORR BDSB 1.5565D+05 -7.8643D+05 4.7186D+06 -3.3423D+06 O 20 IONOSPHERIC CORR BDSB 1.5565D+05 -7.7005D+05 4.7841D+06 -3.3423D+06 U 21 IONOSPHERIC CORR BDSB 1.5565D+05 -7.8643D+05 4.8497D+06 -3.4079D+06 S 22 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 X 23 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 24 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 25 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 26 IONOSPHERIC CORR BDSB 1.5155D+05 -7.2090D+05 4.4564D+06 -3.1457D+06 I 27 IONOSPHERIC CORR BDSB 1.4950D+05 -7.0451D+05 4.4564D+06 -3.1457D+06 G 28 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 29 IONOSPHERIC CORR BDSB 1.5565D+05 -7.7005D+05 4.7841D+06 -3.3423D+06 U 30 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 32 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 33 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 34 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 35 IONOSPHERIC CORR BDSB 1.5565D+05 -7.8643D+05 4.8497D+06 -3.4079D+06 S 36 IONOSPHERIC CORR BDSB 1.5565D+05 -7.8643D+05 4.7186D+06 -3.3423D+06 O 37 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 38 IONOSPHERIC CORR BDSB 1.5565D+05 -7.5366D+05 4.5220D+06 -3.2113D+06 M 39 IONOSPHERIC CORR BDSB 1.5565D+05 -7.7005D+05 4.7841D+06 -3.3423D+06 U 40 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 41 IONOSPHERIC CORR BDSB 1.5565D+05 -7.7005D+05 4.7841D+06 -3.3423D+06 U 42 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 X 43 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 44 IONOSPHERIC CORR BDSB 1.5565D+05 -7.7005D+05 4.7841D+06 -3.3423D+06 U 45 IONOSPHERIC CORR BDSB 1.5565D+05 -7.7005D+05 4.6531D+06 -3.2768D+06 Q 46 IONOSPHERIC CORR BDSB 1.5770D+05 -8.1920D+05 4.9807D+06 -3.5389D+06 W 60 IONOSPHERIC CORR IRNA 4.0047D-08 3.9488D-07 -7.1526D-07 -7.5102D-06 IONOSPHERIC CORR IRNB 1.8432D+05 -8.8474D+05 -2.3593D+06 8.3231D+06 IONOSPHERIC CORR GPUT -2.7939677238D-09-1.065814104D-14 147456 2226 TIME SYSTEM CORR GLUT -3.2596290112D-09 0.000000000D+00 0 0 TIME SYSTEM CORR GAUT -2.7939677238D-09 1.776356839D-15 432000 2225 TIME SYSTEM CORR GAGP -2.9103830457D-09-5.329070518D-15 518400 2225 TIME SYSTEM CORR BDUT -1.8626451492D-09 9.769962617D-15 518345 869 TIME SYSTEM CORR IRUT 5.5006239563D-09-2.220446049D-15 432288 1201 TIME SYSTEM CORR 18 18 1929 7 LEAP SECONDS END OF HEADER G01 2022 09 03 00 00 00 2.907151356340E-04-6.707523425580E-12 0.000000000000E+00 6.800000000000E+01-8.675000000000E+01 3.615150585530E-09 1.802068394950E+00 -4.611909389500E-06 1.201754412610E-02 7.443130016330E-06 5.153666149140E+03 5.184000000000E+05-1.713633537290E-07 8.648046413730E-01-1.434236764910E-07 9.884808768700E-01 2.535625000000E+02 9.439159800150E-01-7.812825435540E-09 -5.643092200300E-11 1.000000000000E+00 2.225000000000E+03 0.000000000000E+00 2.000000000000E+00 0.000000000000E+00 5.122274160390E-09 6.800000000000E+01 5.112060000000E+05 4.000000000000E+00 0.000000000000E+00 0.000000000000E+00提取gps数据的所有参数,跳过头文件,编写c++代码
最新发布
08-23
<think>我们需要从给定的RINEX格式的导航数据文件中提取GPS卫星的数据。注意,文件是混合的(包含多个卫星系统的数据),但我们只关心GPS卫星(卫星标识以'G'开头)。 文件格式说明: - 头文件以"END OF HEADER"结束,之后是数据记录。 - 每个卫星的数据记录占多行:第一行是卫星标识和主要参数,后面跟着的几行是轨道参数(具体行数取决于卫星系统,对于GPS,每个卫星的数据记录有8行,但注意第一行之后还有3行,总共4行?实际上,根据RINEX 3.04格式,每个卫星的数据块包括:第一行(包含卫星PRN、历元时间、卫星时钟参数等),然后后面是3行,每行包含4个轨道参数,总共8个轨道参数?但标准GPS在RINEX 3中每个卫星的数据记录是8行?不对,实际上RINEX 3.04的导航数据文件中,每个卫星的数据块包括: 第一行:卫星ID,历元时间(年、月、日、时、分、秒),卫星时钟参数(a0, a1, a2)以及广播星历参数(IODE, Crs, Delta n, M0) 第二行:Cuc, e, Cus, sqrt(a) 第三行:Toe, Cic, OMEGA, CIS 第四行:i0, Crc, omega, OMEGA DOT 第五行:IDOT, L2 codes, GPS week, L2 P data flag 第六行:SV accuracy, SV health, TGD, IODC 第七行:Transmission time of message, Fit interval, 以及两个空(通常为0) 但是,实际上在RINEX 3.04中,GPS的数据块是8行?不对,根据标准,每个卫星的数据块由多行组成,每行最多4个数。具体来说,每个GPS卫星的数据记录有8行,每行有4个数(但第一行只有3个数?不对,第一行有卫星标识和历元时间以及3个时钟参数,然后还有3个轨道参数,所以第一行实际上有7个数据项?这需要仔细分析。 然而,我们观察给定的数据示例: G01 2022 09 03 00 00 00 2.907151356340E-04-6.707523425580E-12 0.000000000000E+00 6.800000000000E+01-8.675000000000E+01 3.615150585530E-09 1.802068394950E+00 ...(后面还有) 根据RINEX 3.04的格式,第一行包含: 卫星标识(如G01),后面跟着历元时间(年、月、日、时、分、秒),然后3个卫星时钟参数(a0, a1, a2),然后是广播星历参数(IODE, Crs, Delta n, M0)?但是第一行在时钟参数后还有3个参数?不对,实际上第一行在时钟参数后还有3个轨道参数(见标准)。 标准规定:第一行有卫星ID,历元时间(6个整数),然后3个时钟参数(a0, a1, a2),然后3个轨道参数(分别是:IODE, Crs, Delta n, M0?但是这里只有3个?不对,第一行最后三个是:广播星历参数中的三个?实际上,第一行最后三个是:第一组轨道参数(例如Crs, Delta n, M0)?但是标准中第一行最后三个是:IODE(或Crs?),这需要看具体格式。 实际上,在RINEX 3.04中,GPS的每个卫星数据记录有8行,每行有4个数(但第一行在时间之后有3个时钟参数和2个轨道参数?不对,标准中第一行是: PRN (卫星标识), 年(2位或4位), 月, 日, 时, 分, 秒, a0, a1, a2, 然后是3个轨道参数(IODE, Crs, Delta n)?但是示例中第一行最后三个是:0.000000000000E+00(实际上最后三个是0.000000000000E+00,然后行?不对,示例第一行最后三个数据是:2.907151356340E-04(a0)、-6.707523425580E-12(a1)、0.000000000000E+00(a2)?不对,a2后面还有吗?实际上,根据标准,第一行应该包括: 卫星ID,年(4位),月,日,时,分,秒,然后a0, a1, a2,然后接下来的三个轨道参数是:IODE, Crs, Delta_n, M0?但是这里第一行只有9个数(包括卫星ID和6个时间,然后3个时钟参数,然后0.000000000000E+00?不对,示例第一行是: G01 2022 09 03 00 00 00 2.907151356340E-04 -6.707523425580E-12 0.000000000000E+00 然后行,下一行是:6.800000000000E+01 ... 所以,实际上第一行只有卫星ID、6个时间和3个时钟参数(a0, a1, a2),然后剩下的轨道参数在接下来的行中。 根据RINEX 3.04格式,每个卫星的数据记录包括: 第1行: PRN, year, month, day, hour, minute, second, a0, a1, a2 第2行: IODE, Crs, Delta_n, M0 第3行: Cuc, e, Cus, sqrt(a) 第4行: Toe, Cic, OMEGA0, Cis 第5行: i0, Crc, omega, OMEGA_DOT 第6行: IDOT, L2_codes, GPS_week, L2P_data_flag 第7行: SV_accuracy, SV_health, TGD, IODC 第8行: Transmission_time, Fit_interval, 以及两个空(通常为0) 但是,注意:在示例中,第一行之后的数据行每行有4个数(每个数19个字符,包括指数部分)。所以,每个卫星的数据记录有8行(包括第一行)。 然而,我们观察示例数据: 第一行:G01 2022 09 03 00 00 00 2.907151356340E-04 -6.707523425580E-12 0.000000000000E+00 第二行:6.800000000000E+01 -8.675000000000E+01 3.615150585530E-09 1.802068394950E+00 第三行:-4.611909389500E-06 1.201754412610E-02 7.443130016330E-06 5.153666149140E+03 第四行:5.184000000000E+05 -1.713633537290E-07 8.648046413730E-01 -1.434236764910E-07 第五行:9.884808768700E-01 2.535625000000E+02 9.439159800150E-01 -7.812825435540E-09 第六行:-5.643092200300E-11 1.000000000000E+00 2.225000000000E+03 0.000000000000E+00 第七行:2.000000000000E+00 0.000000000000E+00 5.122274160390E-09 6.800000000000E+01 第八行:5.112060000000E+05 4.000000000000E+00 0.000000000000E+00 0.000000000000E+00 所以,每个GPS卫星的数据记录由8行组成,每行4个数(第一行实际上只有3个时钟参数,但第一行在时间之后有3个数,然后行,所以第一行总共9个数据项(包括卫星ID)?不对,第一行:卫星ID(3个字符)、年(4个字符?但实际是整数)、月、日、时、分、秒(各3个字符?),然后三个科学计数法数(每个占19个字符)。所以第一行总共是:3+ (6个整数,每个占3字符?但实际格式是:卫星标识占3字符,然后每个时间占3字符?但年份是4位,所以可能年份占4字符,其他时间占2字符?)实际上,RINEX 3.04的格式是固定的,每个字段的宽度是固定的。 由于我们不是从头解析RINEX文件,而是从数据部分开始,我们只需要跳过直到“END OF HEADER”的行,然后读取后面的数据。 步骤: 1. 读取文件直到遇到包含“END OF HEADER”的行。 2. 然后,读取接下来的行,每次读取8行作为一个卫星的数据块(如果文件还未结束)。 3. 对于每个数据块,第一行的开头如果是'G',则表示是GPS卫星,我们才处理。 4. 解析第一行:卫星ID(如G01),然后6个整数(年、月、日、时、分、秒),然后3个双精度浮点数(a0, a1, a2)。 5. 然后读取接下来的7行,每行4个双精度浮点数(共28个参数),这样每个卫星总共31个参数(加上第一行的3个时钟参数,共3+28=31个参数?不对,实际上第一行除了卫星ID和时间,还有3个时钟参数,然后后面7行每行4个,共28个,所以总共31个数,加上卫星ID和时间)。 注意:在RINEX 3.04中,每个数据行有4个数,每个数19个字符(包括符号和指数部分),所以每行总共有4*19=76个字符,再加上行首可能有空格(但通常没有)。 但是,我们也可以使用字符串流来分割读取,这样更简单。 我们将编写一个C++程序,读取文件,跳过头文件,然后读取每个数据块,如果是GPS卫星,则提取所有参数。 注意:一个文件中可能包含多天的数据,但每个卫星在每个历元有一个数据记录。一个历元一个记录。 由于我们只提取GPS卫星,所以跳过其他卫星(如以'R','C','E','J','I'等开头的卫星)。 数据结构:我们为每个GPS卫星记录定义一个结构体,包含: string prn; // 卫星标识,如"G01" int year, month, day, hour, minute; double second; double a0, a1, a2; // 时钟参数 // 然后是28个轨道参数,我们可以用一个数组(或结构体成员)来存储,但为了清晰,我们可以定义28个变量,但这样太繁琐。或者用一个vector<double>来存储后面的28个参数。 // 但是,为了后续处理方便,我们也可以将整个31个参数(包括时钟参数)都存储在一个结构体中,但注意第一行已经解析了时钟参数,后面的28个是轨道参数。 不过,根据要求,我们需要提取所有参数。所以我们可以将每个卫星的数据记录存储为一个结构体,包含卫星标识、时间、31个参数(3个时钟参数+28个轨道参数)。 但是,由于题目没有要求具体处理这些参数,我们只需要将它们提取出来并输出(或者存储到某个数据结构中),所以我们可以简单地将每个卫星的数据记录存储为一个字符串向量(每行一个字符串),或者将数解析出来存储。 根据问题,我们要求提取所有参数,所以我们将解析这些数。 计划: 1. 定义结构体GPSEphemeris,包含卫星标识、时间(年、月、日、时、分、秒)和31个参数(3个时钟参数和28个轨道参数)。 2. 打开文件,跳过直到“END OF HEADER”的行。 3. 然后循环读取8行(如果文件未结束): - 读取第一行,判断卫星标识是否以'G'开头,如果不是,则跳过接下来的7行(或者不读,因为我们按8行一个块)? - 注意:每个数据块固定8行,所以读取8行作为一个块。 - 然后解析第一行:卫星标识(前3个字符),然后读取6个整数,然后3个双精度数。 - 然后解析接下来的7行,每行4个双精度数(共28个)。 4. 将解析的数据存储到结构体中,并放入一个列表(vector)中。 注意:文件可能很大,所以我们只读取GPS卫星的数据。 下面我们写代码。 注意:在读取头文件时,我们逐行读取,直到遇到包含“END OF HEADER”的行。 代码示例:</think>以下是一个C++程序,用于从给定的RINEX导航数据文件中提取GPS卫星的所有参数,并跳过文件头部分: ```cpp #include <iostream> #include <fstream> #include <string> #include <vector> #include <cctype> #include <iomanip> struct GPSEphemeris { std::string prn; int year; int month; int day; int hour; int minute; double second; double clock_bias; double clock_drift; double clock_drift_rate; std::vector<double> broadcast_params; // 存储28个广播星历参数 }; int main() { std::string filename = "gnss_data.txt"; // 输入文件名 std::ifstream file(filename); if (!file.is_open()) { std::cerr << "Error opening file: " << filename << std::endl; return 1; } std::string line; bool header_end = false; std::vector<GPSEphemeris> gps_data; // 跳过文件头直到END OF HEADER while (std::getline(file, line)) { if (line.find("END OF HEADER") != std::string::npos) { header_end = true; break; } } if (!header_end) { std::cerr << "Header end marker not found!" << std::endl; return 1; } // 读取数据记录 while (std::getline(file, line)) { // 检查是否为GPS卫星数据行 (以G开头) if (!line.empty() && line[0] == 'G') { GPSEphemeris eph; // 解析第一行数据 eph.prn = line.substr(0, 3); eph.year = std::stoi(line.substr(4, 4)); eph.month = std::stoi(line.substr(9, 2)); eph.day = std::stoi(line.substr(12, 2)); eph.hour = std::stoi(line.substr(15, 2)); eph.minute = std::stoi(line.substr(18, 2)); eph.second = std::stod(line.substr(21, 2)); // 解析时钟参数 eph.clock_bias = std::stod(line.substr(23, 19)); eph.clock_drift = std::stod(line.substr(42, 19)); eph.clock_drift_rate = std::stod(line.substr(61, 19)); // 解析后续的7行广播星历参数 for (int i = 0; i < 7; ++i) { if (!std::getline(file, line)) break; // 每行包含4个参数 for (int j = 0; j < 4; ++j) { int start_pos = 4 + j * 19; if (start_pos + 19 <= line.length()) { std::string val_str = line.substr(start_pos, 19); if (!val_str.empty() && !std::isspace(val_str[0])) { eph.broadcast_params.push_back(std::stod(val_str)); } } } } gps_data.push_back(eph); } } // 输出提取的GPS数据 for (const auto& eph : gps_data) { std::cout << "\nSatellite: " << eph.prn << "\n"; std::cout << "Epoch: " << eph.year << "-" << eph.month << "-" << eph.day << " " << eph.hour << ":" << eph.minute << ":" << eph.second << "\n"; std::cout << "Clock Bias: " << std::scientific << std::setprecision(12) << eph.clock_bias << "\n"; std::cout << "Clock Drift: " << eph.clock_drift << "\n"; std::cout << "Clock Drift Rate: " << eph.clock_drift_rate << "\n"; std::cout << "Broadcast Parameters:\n"; for (size_t i = 0; i < eph.broadcast_params.size(); ++i) { std::cout << " Param " << i + 1 << ": " << std::scientific << std::setprecision(12) << eph.broadcast_params[i] << "\n"; } } return 0; } ``` ### 代码解释: 1. **数据结构**: - `GPSEphemeris` 结构体存储GPS卫星的所有参数,包括: - 卫星标识符(PRN) - 历元时间(年、月、日、时、分、秒) - 三个时钟参数(钟差、钟速、钟漂) - 28个广播星历参数(存储在vector中) 2. **文件处理流程**: - 打开文件并检查是否成功 - 跳过所有头文件行,直到遇到"END OF HEADER"标记 - 逐行读取数据部分,只处理以'G'开头的行(GPS卫星数据) 3. **数据解析**: - **第一行**:解析卫星标识、历元时间和三个时钟参数 - **后续7行**:每行包含4个广播星历参数(共28个),使用固定宽度(19字符)解析 - 所有数使用`std::stod`转为双精度浮点数 4. **输出格式**: - 按卫星分组输出所有参数 - 科学计数法显示(保留12位精度) - 清晰标记每个参数的类型和顺序 ### 注意事项: 1. 输入文件格式必须符合RINEX 3.04标准 2. 广播星历参数位置使用固定列宽(每参数占19列) 3. 程序假设每个GPS记录包含完整的8行数据 4. 只处理GPS卫星数据(标识符以'G'开头)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值