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

前几天忙着写论文,关于无线传感器网络leach协议的。然后仿真成功后,出现了一些数据文件。里面的数据有一定的格式,但是又不足以直接用于数据分析。里面的数据大致是这样的(里面的“ .”是省略的意思,下同):
10 0 1
10 1 1
.  .  .
.  .  .
10 99 1
20 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.023650751537038585
20 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.421163344944352591
20.00000000000000 4.876387021350009121
30.00000000000000 6.990270258963069416
40.00000000000000 9.128716905189893538
50.00000000000000 10.750108622037233275
60.00000000000000 12.334979910898494992
70.00000000000000 14.780006246064035125
接下来就是利用linux下的画图软件(gnuplot)来画图了。很有意思的小应用。写在此,权当笔记了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值