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

DO IT YOURSELF !
2016-03-14 11:11
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
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
整个文件能有多大啊  是时时更新的吗

DO IT YOURSELF !
2016-03-14 11:25
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
看了下你的文件,里面数据都是固定到6165,可以这样做:
Data *result = NULL;
result = malloc(6165*sizeof(Data));
然后每次处理一节,循环处理就行了,直到文件结束。似乎要跳过9行才行,你只跳过了一行。
tem没必要定义2800那么大。
2016-03-14 13:55
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
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:10 
我只改了读的部分,计算部分似乎有问题,你可以调一下。另外长度你可以根据实际情况调整
--忘了 关文件了。


#include<stdio.h>
#include<stdlib.h>

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


    infile = fopen("dump.lammpstrj", "r");
    if (infile == NULL)
    {
        printf("\nFailed to open the file");
        exit(1);
    }
    result = malloc(6165 * sizeof(Data));
    for (i = 0; i < 9; i++)
    {
        ret = fgets((char *)tmp, sizeof(tmp), infile); //跳过首行
    }
    while (ret)
    {        
        memset((void *)result,0, 6165 * sizeof(Data));
        i = 0;
        while (fgets((char *)tmp, sizeof(tmp), infile)) //读每一行
        {
            sscanf((char *)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); //测试显示到屏幕上
            
            if (result[i].id == 6165)
            {
                for (i = 0; i < 9; i++)
                {
                    ret = fgets((char *)tmp, sizeof(tmp), infile); //跳过首行
                }
                break;
            }
            i++;
        }
        //fclose(infile);
        i = 0; 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)));
    }
    free(result);
    fclose(infile);
    system("pause");

    return 0;

}

[此贴子已经被作者于2016-3-14 15:32编辑过]

收到的鲜花
  • ton_well2016-03-14 15:34 送鲜花  3朵   附言:好人
2016-03-14 15:06
ton_well
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2015-10-8
收藏
得分:0 
回复 9楼 grmmylbs
好的,万分感谢您

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



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

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