| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5427 人关注过本帖
标题:关于文件数据处理
取消只看楼主 加入收藏
ton_well
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2015-10-8
结帖率:25%
收藏
已结贴  问题点数:10 回复次数:14 
关于文件数据处理
程序代码:
我写了一个对文件里面数据处理的程序,具体做法是读取文本,装入数组中然后进行计算。但是我是半路出家只能对纯数字文本进行处理,但是每次出的结果是按时间间隔一段出来的,我现在的做法是把数据提出来重新放到一个新的文件里面,数据太多时就无法处理了。请问大家有是办法处理这个的?
求大神帮忙,不胜感激!!!!
具体文件在最后面dump2.zip。
程序如下:
#include<stdio.h>
#include<stdlib.h>

typedef struct
{
    int id;
    int type;
    float x;
    float y;
    float z;[local]3[/local]
} Data;
int main()
{
    Data tmp[2800]; //定义一个临时变量,存储每一行数据
    Data result[2800]; //这个数组长度要与文件行数相一致,不能小于
    int n,i=1,k=1,count=0; float sum,S,m,x1,y1,z1;int chains;
    FILE *infile;
   

    infile=fopen("dump.lammpstrj","r");
    if(infile==NULL)
    {
        printf("\nFailed to open the file");
        exit(1);
    }
   

    fgets( tmp, sizeof(tmp), infile ); //跳过首行
    i=1;
    while( fgets( tmp, sizeof(tmp), infile ) ) //读每一行
    {
        sscanf( tmp,"%d %d %f %f %f",&(result[i].id),&(result[i].type),&(result[i].x),&(result[i].y),&(result[i].z)); //放到数组中
        printf("%d %d  %d     %f     %f   %f\n",i,result[i].id,result[i].type,result[i].x,result[i].y,result[i].z); //测试显示到屏幕上
        i++;   

    }
    fclose(infile);
   i=1;S=0;sum=0;chains=1;//计算链取向率,根据分子链长度设定N,n,最后要除以K=N*(n-2)。
   while(chains<=100)
   {  

     

       for(i=k;(i+2)<=2800;i++)
       {

           x1=(result[i+2].x-result[i].x);
           y1=(result[i+2].y-result[i].y);
           z1=(result[i+2].z-result[i].z);
           m=y1*y1/(x1*x1+y1*y1+z1*z1);
           S=S+(3*m-1)/2;printf("%f\n",S);//过程没问题
           if( (i+2)%28==0 )
           {
            sum=sum+S;
            S=0;
            k=i;
            k=k+3;
            count++;printf("%f\n",sum);
            break;
           }
          

       }
       chains++;
   }

 

   n=(i+2)/count;
   chains=chains-1;
   printf("%d\n",n);
   printf("%d\n",chains);  //检查链与主链骨架数是否正确
   printf("%f\n",sum/(chains*(n-2)));
   system("pause");

    return 0;

}


dump2.zip (1.57 MB)
搜索更多相关主题的帖子: 不胜感激 
2016-03-14 10:56
ton_well
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2015-10-8
收藏
得分:0 
ITEM: TIMESTEP
50000
ITEM: NUMBER OF ATOMS
2800
ITEM: BOX BOUNDS pp pp pp
-15.6865 15.6655
-47.9652 47.9632
-15.8523 15.6043
ITEM: ATOMS id type x y z
2 2 -12.9247 11.1409 -9.55074
3 2 -13.5709 9.87734 -9.05745
4 2 -13.4137 8.6729 -9.99791
5 2 -13.5702 7.37794 -9.2121
6 2 -13.619 6.18499 -10.2103
7 2 -13.5006 4.78859 -9.50787
8 2 -13.7576 3.60674 -10.5068
9 2 -13.8462 2.26294 -9.85413
10 2 -14.0146 1.05786 -10.8272
ITEM: TIMESTEP
100000
ITEM: NUMBER OF ATOMS
2800
ITEM: BOX BOUNDS pp pp pp
-15.6865 15.6655
-47.9652 47.9632
-15.8523 15.6043
ITEM: ATOMS id type x y z
2 2 -12.9247 11.1409 -9.55074
3 2 -13.5709 9.87734 -9.05745
4 2 -13.4137 8.6729 -9.99791
5 2 -13.5702 7.37794 -9.2121
6 2 -13.619 6.18499 -10.2103
7 2 -13.5006 4.78859 -9.50787
8 2 -13.7576 3.60674 -10.5068
9 2 -13.8462 2.26294 -9.85413
10 2 -14.0146 1.05786 -10.8272
我的data文件是每隔50000 item TIMESTEP输出一次,所以我想每个item处理一下,要怎么操作。上面的程序只能处理一次item下面的数据,无法处理整个文件

新手报到
2016-03-14 11:21
ton_well
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2015-10-8
收藏
得分:0 
回复 2楼 wp231957
ITEM: TIMESTEP
50000
ITEM: NUMBER OF ATOMS
2800
ITEM: BOX BOUNDS pp pp pp
-15.6865 15.6655
-47.9652 47.9632
-15.8523 15.6043
ITEM: ATOMS id type x y z
2 2 -12.9247 11.1409 -9.55074
3 2 -13.5709 9.87734 -9.05745
4 2 -13.4137 8.6729 -9.99791
5 2 -13.5702 7.37794 -9.2121
6 2 -13.619 6.18499 -10.2103
7 2 -13.5006 4.78859 -9.50787
8 2 -13.7576 3.60674 -10.5068
9 2 -13.8462 2.26294 -9.85413
10 2 -14.0146 1.05786 -10.8272
ITEM: TIMESTEP
100000
ITEM: NUMBER OF ATOMS
2800
ITEM: BOX BOUNDS pp pp pp
-15.6865 15.6655
-47.9652 47.9632
-15.8523 15.6043
ITEM: ATOMS id type x y z
2 2 -12.9247 11.1409 -9.55074
3 2 -13.5709 9.87734 -9.05745
4 2 -13.4137 8.6729 -9.99791
5 2 -13.5702 7.37794 -9.2121
6 2 -13.619 6.18499 -10.2103
7 2 -13.5006 4.78859 -9.50787
8 2 -13.7576 3.60674 -10.5068
9 2 -13.8462 2.26294 -9.85413
10 2 -14.0146 1.05786 -10.8272
我的data文件是每隔50000 item TIMESTEP输出一次,所以我想每个item处理一下,要怎么操作。上面的程序只能处理一次item下面的数据,无法处理整个文件

新手报到
2016-03-14 11:23
ton_well
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2015-10-8
收藏
得分:0 
回复 6楼 grmmylbs
我那个data文件只是截取了部分,实际每次是2800行。您说的那个具体怎么处理,可以具体的将下吗?谢谢了

新手报到
2016-03-14 14:46
ton_well
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2015-10-8
收藏
得分:0 
回复 5楼 wp231957
整个文件有几M,200多个items,我想对item进行循环操作,但是找不到方法

新手报到
2016-03-14 14:47
ton_well
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2015-10-8
收藏
得分:0 
回复 9楼 grmmylbs
好的,万分感谢您

新手报到
2016-03-14 15:28
ton_well
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2015-10-8
收藏
得分:0 
回复 9楼 grmmylbs
对了,那个6125是根据什么来的

新手报到
2016-03-14 15:40
ton_well
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2015-10-8
收藏
得分:0 
回复 12楼 grmmylbs
对的,我看成截图的文件了。我想问一下新生成的数组的i是一直增大下去,还是到的id=6165时然后重新重一开始的?我对malloc不是太了解,谢了

新手报到
2016-03-14 17:43
ton_well
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2015-10-8
收藏
得分:0 
回复 6楼 grmmylbs
我按照您上次的知道又写了一个文件对data文件处理,
ITEM: TIMESTEP
10000
ITEM: NUMBER OF ENTRIES
2088
ITEM: BOX BOUNDS pp pp pp
-5 25
-5 25
-2 52
ITEM: ENTRIES index c_1[1] c_1[2] c_1[3] c_2[1]c_2[2]
主要是看每组当中的第四行每次增加量,但是每次运行到最后一组时就会出现debug错误,不知道是怎么回事,希望您能帮忙看下,万分感谢
#include
#include
FILE *pfile;
typedef struct
{
    int id;
    int atom1;
    int atom2;
    int type;
    float x;
    float y;
} Data;
int main()
{
    Data tmp[50]; //定义一个临时变量,存储每一行数据
    Data *result; //这个数组长度要与文件行数相一致,不能小于
    int n, i = 1, count,number, sum=0; float S = 0, m, x1, y1, z1 ;
    int chains,ret;
    FILE *infile;


    infile = fopen("bond.dump", "r");
    if (infile == NULL)
    {
        printf("\nFailed to open the file");
        exit(1);
    }
    //注意分配内存时 数字的大小对应ID大小
    for (i = 0; i < 9; i++)
    {
        ret = fgets((char *)tmp, sizeof(tmp), infile); //跳过文字行
        if(i==3)
        {
            sscanf((char *)tmp, "%d", &(number)); //放到数组中
        }
   
    }   

    result = malloc(number * sizeof(Data));
    while (ret)
    {        
        memset((void *)result,0, number * sizeof(Data));
        i = 1;
        while (fgets((char *)tmp, sizeof(tmp), infile)) //读每一行
        {
            sscanf((char *)tmp, "%d %d %d %d %f %f", &(result[i].id), &(result[i].atom1), &(result[i].atom2), &(result[i].type), &(result[i].x),&(result[i].y)); //放到数组中
            printf("%d %d  %d %d    %d     %f   %f\n", i, result[i].id, result[i].atom1, result[i].atom2,result[i].type, result[i].x, result[i].y); //测试显示到屏幕上
        
        if (i == number)
         {
            sum=number-2088;
      //      printf("%d\n",sum);
            if((pfile=fopen("output.data","a"))==NULL)  printf("lFile could not be opened.\n");
            else
            {
                fprintf(pfile,"%d\n", (number-2088) );
            }
            fclose(pfile);

            for (i = 0; i < 9; i++)
            {
                ret = fgets((char *)tmp, sizeof(tmp), infile); //跳过非数值行
                if(i==3)
                {
                    sscanf((char *)tmp, "%d", &(number)); //放到数组中
                    printf("%d\n",number);
                }
            }
            break;
         }

        i++;            
     }
      
   }
   
    free(result);
    fclose(infile);
    system("pause");

    return 0;

}

新手报到
2016-03-28 15:58
ton_well
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2015-10-8
收藏
得分:0 
回复 16楼 grmmylbs
好的,谢谢了。主要是2088这一项是逐渐增加的,就是说里面的行数在不断增加的,我上面运行都没问题,就是最后一组回出现debug错误
ITEM: TIMESTEP
10000
ITEM: NUMBER OF ENTRIES
2088
ITEM: BOX BOUNDS pp pp pp
-5 25
-5 25
-2 52
[local]1[/local]

新手报到
2016-03-28 16:27
快速回复:关于文件数据处理
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.048489 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved