⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 controlf.c

📁 用C编写的关于GPS中读取输入文件子程序!
💻 C
字号:
controlf.c

void r_con(fp_rinex,fp_orbit,fp_docu,conf_name,icon,i_con,x0,
           idN00,N00,N0tb,m00,ici,docux) 
/*  函数 r_con 读取一个数据文件的控制信息并打开它 */  
FILE *fp_rinex[Ista],*fp_orbit[Ista],*fp_docu[6]; 
char conf_name[I50];
char docux[I50];
int icon[I10*Isat],i_con,ici[Iunknown];
double x0[3*Ista];
long idN00[Iunknown],N0tb[Iunknown];
double N00[Iunknown],*m00;
{   FILE *fp,*fp_r[Ista];
    int id,i_rf,i_of,i_rf1,i,j,k,k1,ih,im,is,idebug,idocu=0,iresu=0,I=0;
    int iresu1=0;
    char orbitf_name[Ista][I50],rinexf_name[Ista][I50];
    char str[Iline],str1[Iline],docuf_name[I50],resuf_name[I50];
    double f,f1,f2,f3,f4;
/* 打开并读控制文件 */
if(i_con<=1) 
{   printf("input control data file_name please\n");
        scanf("%s",conf_name); printf("file name is: %s\n",conf_name); }
    if((fp = fopen(conf_name,"r")) == NULL)
    { printf("Cannot open the file : %s\n",conf_name);
    exit(0); }
/* 对 rinex,orbit 文件数设置初始值 i_rf,i_of */
    i_rf=0;i_of=0;i_rf1=0;
    for(i=0;i<I10*Isat;i++) icon[i]=-2;
/* 读取控制数据文件 */
    nextline:;
    k1 = getline(fp,str); if(k1<=1) goto nextline;
    if(strstr(str,"EOF")) goto dataend;
    if(strstr(str,"*")) goto nextline;
    if(O_rcon==0) printf("%s",str); 
/* 求出指标 ':',拷贝‘:’前的 str 为 str1 */
    id = indexx(str,':'); strncpy(str1,str,id); str1[id]='\0';
/* gps 数据文件名 */
if(strstr(str,"RINEX data")) 
{  repeat:;
       for(i=0;i<id;i++) if(str1[i]==' ') 
       { for(j=i+1;j<=id;j++) str1[j-1]=str1[j];   
         id -= 1; goto repeat; }
       strncpy(rinexf_name[i_rf],str1,id); rinexf_name[i_rf][id]='\0'; i_rf+=1; 
       icon[0] = i_rf; 				/* 记录在 icon[0] 中的测站名 */
       goto nextline; }
/* igs 数据文件名 */
if(strstr(str,"IGS")) 
{  if(icon[1]==2) 
       printf("error : not allowed to use both IGS,Broad orbit\n");
       icon[1]=1; 				/* icon[1]=1,2 应用的IGS,广播星历 */
       repeat1:;
       for(i=0;i<id;i++) if(str1[i]==' ') 
       {  for(j=i+1;j<=id;j++) str1[j-1]=str1[j];   
          id -= 1; goto repeat1; }
       strncpy(orbitf_name[i_of],str1,id); orbitf_name[i_of][id]='\0';i_of+=1; 
       icon[2]=i_of; goto nextline; }
/* 广播星历文件名 */
if(strstr(str,"Broadcast")) 
{  if(icon[1]==1)
       printf("error : not allowed to use both IGS,Broad orbit\n");
       icon[1]=2;
       repeat2:;
       for(i=0;i<id;i++) if(str1[i]==' ') 
        { for(j=i+1;j<=id;j++) str1[j-1]=str1[j];   
          id -= 1; goto repeat2; }
/*  在函数中strncpy 加上id */
       strncpy(orbitf_name[i_of],str1,id); orbitf_name[i_of][id]='\0';i_of+=1; 
       icon[2]=i_of; goto nextline; }
if(strstr(str,"Document")) 
{ idocu+=1;
       repeat3:;
       for(i=0;i<id;i++) if(str1[i]==' ') 
       {  for(j=i+1;j<=id;j++) str1[j-1]=str1[j];   
          id -= 1; goto repeat3; }
       strncpy(docuf_name,str1,id); docuf_name[id]='\0'; 
       goto nextline; }
/* 每个测站的坐标 x,y,z  */
if(strstr(str,"Coordinates")) 
{  sscanf(str,"%lf %lf %lf %lf",&f,&f1,&f2,&f3);
       x0[0+i_rf1*3]=f; x0[1+i_rf1*3]=f1; x0[2+i_rf1*3]=f2; 
       TropCoef[i_rf1]=1.; i_rf1+=1;
       goto nextline; }
/* 应用上述坐标 x,y,z 或应用 Rinex 数据的输入 */
if(strstr(str,"Icoordinates")) 
{ sscanf(str,"%d",&i); icon[3]=i; Icoord=i;
 goto nextline; }
/* 年 月  日 */
if(strstr(str,"Year")) 
{  sscanf(str,"%d %d %d",&ih,&im,&is); 
       icon[16]=ih; icon[17]=im; icon[18]=is;
       goto nextline; }
/* 开始时间 */
if(strstr(str,"Begin")) 
{  sscanf(str,"%d %d %d",&ih,&im,&is); 
       icon[4]=ih; icon[5]=im; icon[6]=is; 
       goto nextline; }
/* 结束时间 */
if(strstr(str,"End")) 
{  sscanf(str,"%d %d %d",&ih,&im,&is); 
       icon[7]=ih; icon[8]=im; icon[9]=is;
       goto nextline; }
/* 时间间隔 */
if(strstr(str,"Time")) 
{  sscanf(str,"%d %d",&ih,&im); 
       icon[10]=ih; icon[11]=im; 
       goto nextline; }
/* 静态测量/动态测量 */
    icon[12]=1;
/* 参考卫星Ref_sv */
if(strstr(str,"Ref_sv")) 
{ sscanf(str,"%d",&ih); icon[14]=ih;
  goto nextline; }
/* 对流层模型 */
    icon[15]=1;
/* 双频组合方法 */
if(strstr(str,"Dual")) 
{  if(strstr(str,"Factor1"))   /* 组合因子 Factor1,2 */
      {   sscanf(str,"%d %d",&ih,&im); icon[21]=ih; icon[22]=im; 
          Factor1=ih*1./im; goto nextline; }
       if(strstr(str,"Factor2")) 
        { sscanf(str,"%d %d",&ih,&im); icon[23]=ih; icon[24]=im; 
          Factor2=ih*1./im; goto nextline; }}
if(strstr(str,"DD")) 
{ sscanf(str,"%d",&ih); icon[20]=ih; goto nextline; }
/* 拉格朗日多项式 */
    icon[25]=7;
/* 参数 Trop_, Clock_, Tide_, Rela_  */
    icon[30]=0; icon[31]=1; icon[32]=0; icon[33]=0;
if(strstr(str,"Cycleslip")) 
{  sscanf(str,"%d %d",&ih,&im); Cycleslip=ih+im/10.; 
       Cycleslip=twoi2f(ih,im); goto nextline; }
if(strstr(str,"M_cyctest")) 
{ sscanf(str,"%d",&ih); M_cyctest=ih; goto nextline; }
if(strstr(str,"Igs_v")) 
{ sscanf(str,"%d",&ih); Igs_v=ih; goto nextline; }
if(strstr(str,"Run_n")) 
{ sscanf(str,"%d",&ih); Run_n=ih; goto nextline; }
if(strstr(str,"Ambiguity")) 
{ sscanf(str,"%d",&ih); Ambiguity=ih; goto nextline; }
/* 打开和关闭 Debug 函数 */
    if(strstr(str,"EOF")) goto dataend;
    else goto nextline;
    dataend:;
    rewind(fp);
/* 检查输入参数,打开报告文件 */
    if(idocu!=0) {
       if((fp_docu[0] = fopen(docuf_name,"w")) == NULL)
       {printf("Cannot open output file : %s\n",docuf_name);
        exit(0);} }
      else
       { if((fp_docu[0] = fopen("docu","w")) == NULL)
         {printf("Cannot open output file : docu\n");
          exit(0);} }
/* 输出和输入控制文件到 docuf 文件  */
    nextline1:;
    k1 = getline(fp,str); if(k1<=1) goto nextline1;
    if(!strstr(str,"EOF")) { fprintf(fp_docu[0],"%s",str); goto nextline1;}
    fprintf(fp_docu[0],"%s",str); fclose(fp);
/* 输出信息到报告文件中 */
    Tsta=icon[0];
/* 将 debug 开关参数放入公共变量,打开有关文件 */
     for (i=0;i<icon[0];i++) 
     { if((fp_rinex[i] = fopen(rinexf_name[i],"r")) == NULL)
        {printf("Cannot open input file : %s\n",rinexf_name[i]);
           exit(0); }}
     for (i=0;i<icon[2];i++) 
     {  if((fp_orbit[i] = fopen(orbitf_name[i],"r")) == NULL)
        {printf("Cannot open input file : %s\n",orbitf_name[i]);
           exit(0); } }
/* 打开控制数据文件 */
     for(i=200;i<210;i++) icon[i]=0;
/* 如果run_n==2,3 从 keybord,file Ncancel读 N00id,N00tb,N00te */
if(Run_n==2) 
{  printf("input to be canceled N number\n");
       scanf("%d",&Ncancel_n); printf("input is: %d\n",Ncancel_n); 
       for(i=0;i<Ncancel_n;i++) 
       {  printf("input integer N00id N00tb N00te \n");
          scanf("%ld %ld %ld",&N00id[i],&N00tb[i],&N00te[i]); 
          printf("N00idtbte= %8d %8d %8d",N00id[i],N00tb[i],N00te[i]);} } 
if(Run_n>=3) 
{ if(icon[12]==1) 
  { if((fp = fopen("ncancel","r")) == NULL)
          { printf("Cannot open the file : ncancel\n");
          exit(0); }
          k1 = getline(fp,str); if(k1<=1)printf("file Ncancel error\n");
          sscanf(str,"%d",&Ncancel_n); printf("Ncancel_n is: %d\n",Ncancel_n); 
          for(i=0;i<Ncancel_n;i++) 
           { k1 = getline(fp,str); if(k1<=1)printf("file Ncancel error\n");
             sscanf(str,"%ld %ld %ld",&N00id[i],&N00tb[i],&N00te[i]); 
             printf("N00idtbte= %8d %8d %8d\n",N00id[i],N00tb[i],N00te[i]); }
          fclose(fp); }}}
void wr_condat(fp,idN00,N0tb,N00,m00,ici,iunknown,icon_)
/* 写/读 (icon_1=1/2) 数据 idN00, N0tb, N00, m00, iunknown
   到 fp (file con_dat), iunknown = icon[201] */
FILE *fp;
long idN00[Iunknown],N0tb[Iunknown];
double N00[Iunknown],*m00;
int ici[Iunknown],*iunknown,icon_;
{ int i,j,j1,k; char s[Iline]; long i1,i2; double f1;
     if(icon_==1) 
   { fprintf(fp," %d %lf\n",*iunknown,*m00);
        for(i=0;i<*iunknown;i++) 
      { fprintf(fp,"0 %8d %8d %lf\n",idN00[i],N0tb[i],N00[i]);} }
else 
{   i=getline(fp,s); 
        sscanf(s,"%d %lf",&j,&f1); printf("%d %lf\n",j,f1);
        for(k=0;k<j;k++) 
        {  i=getline(fp,s); sscanf(s,"%d %ld %ld %lf",&j1,&i1,&i2,&f1); 
           printf("%d %ld %ld %lf\n",j1,i1,i2,f1); 
           ici[k]=j1; idN00[k]=i1; N0tb[k]=i2; N00[k]=f1; }}
     fclose(fp);}
int indexx(s,c)
/* 在字串s中搜索字母c,如无发现返回-1,s的最大维数为 Iline */
char s[Iline],c;
{    int i,i1,j,j1,k=-1;
     i1 = strlen(s);
     for (i=0;i<i1;i++) 
   { if (s[i]==c) {k = i; return(k);} }
     return(k);}
void DOP(fp,icon,Fi,La,an,idN0)
FILE *fp;
int icon[I10*Isat];
double Fi[Ista],La[Ista];
double an[Nlow];
long idN0[Iunknown];
/* 计算DOP */ 
{   long i,j,k,l,m;
    double sum,sum1,sum2,phi,lambda,h,X[3],Q[6];
    for(sum=0.,i=0;i<icon[201];i++) sum += an[i+i*(i+1)/2]; /* GDOP */
    sum = sqrt(sum); 
    fprintf(fp,"GDOP = %lf\n",sum);
    for(sum1=0.,i=0;i<icon[201];i++) /* PDOP */
{   j=idN0[i]-(idN0[i]/10)*10;
    if(j==1||j==2||j==3) sum1 += an[i+i*(i+1)/2]; }
    sum1 = sqrt(sum1); 
    fprintf(fp,"PDOP = %lf\n",sum1);
    for (sum2=0.,i=0;i<icon[201];i++) /* ADOP */
{  if(idN0[i] > 1000000) sum2 += an[i+i*(i+1)/2];  }
    sum2 = sqrt(sum2); 
    fprintf(fp,"ADOP = %lf\n",sum2);
    /*for(i=0;i<icon[201]*(icon[201]+1)/2;i++) /* HDOP,VDOP */
{  printf("an[%d]=%lf \n",i,an[i]); }*/
for(k=0;k<icon[201];k++) 
{  j=idN0[k]-(idN0[k]/10)*10;
       i=(idN0[k]-j)/10;
       if(i<=icon[0] && j==1) 
       { /*printf("k=%d\n",k);*/
          phi=Fi[k]; lambda=La[k];
          X[0]=0.;X[1]=0.;X[2]=0.;
          Q[0] = an[k+k*(k+1)/2];
          l=k+1;
          Q[2] = an[l+l*(l+1)/2];
          Q[1] = an[l+l*(l+1)/2-1];
          l=k+2;
          Q[5] = an[l+l*(l+1)/2];
          Q[4] = an[l+l*(l+1)/2-1];
          Q[3] = an[l+l*(l+1)/2-2];
          /*printf("Q= ");
          for(l=0;l<6;l++) printf("%lf ",Q[l]);
          printf("\n");*/
          rotation(stdout,phi,lambda,X,Q,1);
          /*printf("rQrT= ");
          for(l=0;l<6;l++) printf("%lf ",Q[l]);
          printf("\n");*/
          sum1=Q[0]+Q[2]; sum2=Q[5]; 
          sum1 = sqrt(sum1); sum2 = sqrt(sum2); 
          fprintf(fp,"%d-th HDOP = %lf\n",i,sum1);
          fprintf(fp,"%d-th VDOP = %lf\n",i,sum2); }}}
void w_info(fp,x0,b1,p,m0,icon,Fi0,idN0,N0,N0t)
FILE *fp;
double x0[3*Ista],b1[Iunknown],p[Iunknown],m0;
int icon[I10*Isat];
long Fi0[Iunknown],idN0[Iunknown],N0[Iunknown],N0t[Iunknown];
{ long i,j,k,l,m;
/* 将信息写入缓冲区 fp */
    fprintf(fp,"total obs. number %ld\n",icon[207]*10000+icon[202]);
    fprintf(fp,"total unknowns number %d\n",icon[201]);
    fprintf(fp,"total stations number %d\n",icon[0]);
    fprintf(fp,"total epoches. number %d\n",icon[211]);
    fprintf(fp,"iterations number %d\n",icon[210]);
    fprintf(fp,"initial coordinates used :\n");
for (i=0;i<icon[0];i++) 
{  for (j=0;j<3;j++) fprintf(fp,"%16.4f",x0[j+i*3]);
       fprintf(fp,"\n"); }
    fprintf(fp,"m0 = %10.4f\n",m0);
    fprintf(fp,"solutions vectors are :\n");
    fprintf(fp," b1, p, idN0, N0, N0t, Fi0, Fi0-N0+b1, N00_n:\n");
for (i=0;i<icon[201];i++) 
{  fprintf(fp,"%10.4f %10.4f %8d %8d %8d %10d %16.4f %5d\n",
       b1[i],p[i],idN0[i],N0[i],N0t[i],Fi0[i],Fi0[i]-N0[i]+b1[i],N00_n[i]);}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -