文件信息有很多,怎么存到结构体里呢?

SS哭辽 2021-02-26 10:21:46
想打开一个日志文件并把它存到结构体中,,但是文件有很多条,能在定义结构体时通过for循环把所有信息存到items里吗? #include<stdio.h> #include<string.h> struct record//record为结构体名 { char method[255]; char ip[255]; char protocol[255]; char time[255]; char add[255]; char port[255]; char page[255]; int status; char exploer_info[255]; struct prams { char key[255]; char value[255]; }; int prams_cnt; };//定义结构体 int main(void) { FILE *fp; fp=fopen("access.log","r+");//打开文件 if(!fp) { printf("false\n"); return -1;//直接返回 } else{ printf("true\n"); }//判断文件是否成功打开 struct record items[255];//所有记录 int items_cnt=0;//记录数 char line[2048]; int i=0,x,j,j_pos,j_pos1; int lines=0; int pos[9],pos1[9]; char s='['; char s1=']'; struct record rec;//定义结构体变量 printf("日志分析:\n"); while((fgets(line,2048,fp))!=NULL) { x=strlen(line); j_pos=0,j_pos1=0; for(j=0;j<x;j++) { if(line[j]==s)//此处为'['开始的位置 { pos[j_pos]=j; j_pos++; } if(line[j]==s1)//']'结束的位置 { pos1[j_pos1]=j; j_pos1++; } } //strncpy_s函数的使用strncpy_s(char *str2,int size2,char *str1,int size1); strncpy_s(items[s].method,sizeof(items[s].method),line+pos[0]+1,pos1[0]-pos[0]-1); strncpy_s(items[s].ip,sizeof(items[s].ip),line+pos[1]+1,pos1[1]-pos[1]-1); strncpy_s(items[s].protocol,sizeof(items[s].protocol),line+pos[2]+1,pos1[2]-pos[2]-1); strncpy_s(items[s].time,sizeof(items[s].time),line+pos[3]+1,pos1[3]-pos[3]-1); strncpy_s(items[s].add,sizeof(items[s].add),line+pos[4]+1,pos1[4]-pos[4]-1); strncpy_s(items[s].page,sizeof(items[s].page),line+pos[5]+1,pos1[5]-pos[5]-1); strncpy_s(items[s].port,sizeof(items[s].port),line+pos[6]+1,pos1[6]-pos[6]-1); strncpy_s(items[s].status,sizeof(items[s].status),line+pos[7]+1,pos1[7]-pos[7]-1); strncpy_s(items[s].exploer_info,sizeof(items[s].exploer_info),line+pos[8]+1,pos1[8]-pos[8]-1); //结构体成员赋值 } /*if(line[strlen(line)-1]=='\n') { lines++; }*/ //int maxi=0,maxn=0; int fclose(FILE *fp); fp=fopen("access.log","r+"); int n=0,m=0; while(fgets(line,2048,fp)!=NULL) { puts(line); n++; if(strncmp(line,"[GET]",5)==0) { m++; }//比较两字符串,相等时strncmp函数值返回0,计数 }//输出日志文件内容并统计计数 printf("输出GET请求所占比例:%f\n",1.0*m/n);//输出所占百分比; int maxi=0,maxn=0; char arr[255]={0}; char vis[255]={0}; /*for(i=0;i<line[i];i++) { if(maxn<vis[i]) { maxn=vis[i]; maxi=i; } }*/ for(i=0;i<line[i];i++) { arr[items[i].status]++; vis[items[i].status]=1; if(maxn<vis[i]) { maxn=vis[i]; maxi=i; } } printf("%lf\n",1.0*arr[i]++/i); printf("%lf",maxi); int fclose(FILE *fp);//关闭文件 return 0; }
...全文
89 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-06
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
自信男孩 2021-02-26
  • 打赏
  • 举报
回复
内容很多,建议分类,并且找到信息类型一样的,并在结构体里定义对应的元素,根据信息量的条数来定结构体变量的大小或结构体数组的大小
赵4老师 2021-02-26
  • 打赏
  • 举报
回复
仅供参考:
//NAME: essaie bla bla
//DIMENSION: 8
//DATA
//1  14  15
//2  11  10
//3  6   4
//4  7   13
//5  9   21
//6  19  3
//7  1   5
//8  8   8
//EOF
//
// 文本文件中可能还含有其他内容,但是需要用到的内容即以上

//比如data.txt:
//NAME: essaie bla bla
//其它内容
//DIMENSION: 8
//其它内容
//DATA
//其它内容
//1  14  15
//其它内容
//2  11  10
//其它内容
//3  6   4
//其它内容
//4  7   13
//其它内容
//5  9   21
//其它内容
//6  19  3
//其它内容
//7  1   5
//其它内容
//8  8   8
//其它内容
//EOF

// 目标是要获取NAME后字串,DIMENSION后数值,以及DATA以下的数值
// 其中NAME就是随便个字句,DIMENSION是城市数量,DATA以下是城市编号,X坐标,Y坐标
// 所有的这些将赋值给一个事先定义好的结构
#include <stdio.h>
#include <string.h>
#define MAXCPL   80   //每行最大字符数
#define MAXCITY  100  //每组数据中DATA最多项数,DIMENSION的最大值
#define MAXNAMEL 32   //NAME最大长度
struct S {
    char NAME[MAXNAMEL+1];
    int  DIMENSION;
    struct D {
        int NO;
        int X;
        int Y;
    } DATA[MAXCITY];
} s;
FILE *f;
int st,n,i;
char ln[MAXCPL];
int main() {
    f=fopen("data.txt","r");
    if (NULL==f) {
        printf("Can not open file data.txt!\n");
        return 1;
    }
    st=0;
    n=0;
    while (1) {
        if (NULL==fgets(ln,MAXCPL,f)) break;
        if (st==0) {
            if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;
        } else if (st==1) {
            if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;
        } else if (st==2) {
            if (0==strcmp(ln,"DATA\n")) st=3;
        } else if (st==3) {
            if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {
                n++;
                if (n>=MAXCITY || n>=s.DIMENSION) break;
            }
        }
    }
    fclose(f);
    printf("s.NAME=[%s]\n",s.NAME);
    printf("s.DIMENSION=%d\n",s.DIMENSION);
    for (i=0;i<n;i++) {
        printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);
    }
    return 0;
}
//s.NAME=[essaie bla bla]
//s.DIMENSION=8
//s.DATA[0].NO,X,Y=1,14,15
//s.DATA[1].NO,X,Y=2,11,10
//s.DATA[2].NO,X,Y=3,6,4
//s.DATA[3].NO,X,Y=4,7,13
//s.DATA[4].NO,X,Y=5,9,21
//s.DATA[5].NO,X,Y=6,19,3
//s.DATA[6].NO,X,Y=7,1,5
//s.DATA[7].NO,X,Y=8,8,8

forever74 2021-02-26
  • 打赏
  • 举报
回复
早些年有个syslog-ng是用来日志入库的,近几年流行啥就不知道了,没有跟踪。
forever74 2021-02-26
  • 打赏
  • 举报
回复
看到楼主仍然坚持嵌套定义结构体(这是个编译错误),就没兴趣继续看下去了。 一般地说,要在结构体数组和文件之间互动,还是使用二进制文件方便一些。 对于楼主面临的分析日志,由于文件长度不定,另外全部读入内存也没有算法上的必要,因此建议还是用我的风格,读一行统计一行,扔掉,读下一行。 这样一来,用不用结构体不是关键,或者说结构体就多余了。 最后,如果是工作需要,那么建议找个开源软件代替syslog,日志入库,你要分析什么的可以上SQL,很香的。

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧