前几天忙着写论文,关于无线传感器网络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)来画图了。很有意思的小应用。写在此,权当笔记了。