c文件操作简单应用——fscanf()

来源:互联网 发布:开淘宝网店不交保证金 编辑:程序博客网 时间:2024/05/21 01:58
前几天忙着写论文,关于无线传感器网络leach协议的。然后仿真成功后,出现了一些数据文件。里面的数据有一定的格式,但是又不足以直接用于数据分析。里面的数据大致是这样的(里面的“ .”是省略的意思,下同):
10 0 110 1 1.  .  ..  .  .10 99 120 0  1.  .  ..  .  .20 99 1.  .  ..  .  .607.90000000006967 99 0

数据中最左面的一列是时间参数,最右面的是节点当时的状态,0是死亡(能量耗尽),1是活着,中间的是对应的节点的ID,一共100个节点。这是原始数据,但是我想要时间参数和对应的此时间的活着的节点数据,也就是统计在某一时刻,最右面一列1的个数。原本想自己数一下,但是发现数据一下子有6000多行,不太可行。最终决定写个简单的程序,处理一下。用c语言,又涉及到c语言的文件操作,由于以前没怎么弄过,最终查了些资料,明白了c语言中下相关文件操作函数的用法。实现代码如下,最后完美解决。


#include <stdio.h>//#include <stdlib.h>int main(void){  FILE* fp;    FILE *fp_res;  int m=0;  int n=0;  double a=0.0;  int b=0;  int c=0;  int sum=0;    fp = fopen("leach.alive","r");  if(!fp)  {    perror("fopen");  }  fp_res = fopen("alive.out","wt");  fseek(fp,0,SEEK_SET);  for(m=10;m<=610;m+=10)  {    for(n=0;n<100;n++)    {      fscanf(fp,"%lf %d %d %*[\n]",&a,&b,&c);      if(c == 1)sum = sum+1;      printf("%.14f\t%d\t%d\n",a,b,c);    }    fprintf(fp_res,"%.14f %d\n",a,sum*2);    a=0.0;b = 0;    c=0;    sum = 0;  }  fclose(fp);  fclose(fp_res);  return 0;}

用到fscanf()和fsprintf()函数。它们的详细说明百度百科上有,可以查。接下来还有一个文件涉及小数位数很长的浮点数。以前没有处理写程序,没有处理过那么小的小数。

原始数据格式如下:

10 0 0.021071690871238564.  .  ..  .  .10 99 0.02365075153703858520 0 0.042791842364373486.  .  ..  .  .20 99 0.048625785045803928.  .  ..  .  .607.90000000006967 99 2.0022387625400144

文件中第一列数据 和 最后一列数据都是浮点数,而且小数位数达到18位。这一次要统计对应的时间内,右面一列数值的总和。还是用fscanf()和fsprintf()函数:

#include <stdio.h>int main(void){  FILE* fp;    FILE *fp_total;  FILE *fp_ave;  char str[11];  double a;  int b;  double c=0.0;  int n=0;  int m=0;  int i=0;  double sum=0.0;  double ave=0.0;    fp=fopen("aa","r");  if(!fp);  {   // printf("open error\n");    perror("fopen");   // return 1;  }  fp_total = fopen("total.out","wt");//打开建立一个文件  fp_ave = fopen("ave.out","wt");  fseek(fp,0,SEEK_SET);  for(m=10;m<=610;m+=10)  {    for(n=0;n<100;n++)    {       fscanf(fp,"%lf %d %lf %*[\n]",&a,&b,&c);       sum = sum+c;       printf("%.14f\t%.18f\n",a,c);    }    ave = sum/100;    fprintf(fp_total,"%.14f %.18f\n",a,sum);    fprintf(fp_ave,"%.14f %.18f\n",a,ave);    a=0.0;    b=0;    c=0.0;    sum=0.0;    ave=0.0;      }  fclose(fp);  fclose(fp_total);  fclose(fp_ave);  return 0; }
处理后的数据只剩下两列,在文件中:

10.00000000000000 2.42116334494435259120.00000000000000 4.87638702135000912130.00000000000000 6.99027025896306941640.00000000000000 9.12871690518989353850.00000000000000 10.75010862203723327560.00000000000000 12.33497991089849499270.00000000000000 14.780006246064035125
接下来就是利用linux下的画图软件(gnuplot)来画图了。很有意思的小应用。写在此,权当笔记了。



原创粉丝点击