实验周作业~~QQ聊天记录的处理

我去的时候就剩这个题目了,真坑啊~~

1,最重要的问题,原文档本身就有很多不符合规范的地方(例如紫水晶聊天记录)(少了聊天对象,括号内并不是聊天,极少情况导出的就有乱码,以及聊天记录为空)
2,编码格式问题,要将原文档(UTF-8)转为ANSI格式.
3,无法处理的问题,有些文档突然出现了活跃,话痨等标志

#include <stdio.h>
#include <Windows.h>
#include <string.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
#include<io.h>
#ifndef UNICODE
    #define UNICODE
#endif

#ifdef UNICODE
    #ifndef _UNICODE
        #define _UNICODE
    #endif
#endif
int find(char s[],char ch,int index)//从s数组的第index开始查找ch元素
{
    int i,j,l;
    l=strlen(s);
    for (i=index;i<l;i++)
        if (s[i]==ch)
        return i;
        return 0;
}
int findchinese(wchar_t p[],wchar_t shangwu[])
{
    int i,l;
    wchar_t q;
    l=wcslen((wchar_t*)p);
    for (i=0;i<l;i++)
        if ((q=wcschr((wchar_t*)shangwu,p[i]))!=NULL)
        return 1;
        return 0;
}
void menu()
{
    printf("*************从群组文件夹下导出信息请按1***********************\n");
    printf("*************从好友文件夹下导出信息请按2***********************\n");
    printf("*************退出请按3*****************************************\n");
}
void menu2()
{

    printf("******************查询群组名请按1*****************\n");
    printf("******************查询QQ号请按2*******************\n");
    printf("******************根据内容请按3*******************\n");
    printf("******************退出请按4***********************\n");
}
void menu3()
{
    printf("*****************查询好友QQ号请1************************\n");
    printf("*****************根据内容查找请按2**********************\n");
    printf("******************退出请按3*****************************\n");
}
int main()
{
        system("color b5");
        FILE *fp,*fp2,*fp1,*fp3,*fp4;
        long  Handle;
        struct _finddata_t fa;
        long fHandle;
        setlocale( LC_ALL, "CHS" ); //将CHS设为你系统用的编码
        char ch;
        char a[1500],b[1500],c[1500],d[1500],e[1500],context[1000][1500];
        char year[1000][40],month[1000][40],day[1000][40];
        char groupname[1000][100];
        char friendname[1000][100];
        int friendnum;
        char begin2[]={"d://temp//"};
        char begin3[]={"d://temp//"};
        char begin4[]={"d://temp2//"};
        char begin5[]={"d://temp2//"};
        char *end;
        wchar_t *end1;
        wchar_t temp[1000],*temp1;
        wchar_t dot[]=L".";
        wchar_t gang[]=L"-";
        wchar_t shangwu[]=L"上";
        int h1[100];
        int m1[100];
        char QQ[100][100];
        char panduan[20];
        int calculate[1000];
        int textnumber[100];//每一个组的信息数
        int grouptextnumber,groupnum,t,h,i,t1,t2,q,ok,before,friendtextnumber,ok2;
        menu();
        ch=getchar();
        while(ch!='3')
        {

            if (ch=='1')
            {
                fp1=fopen("D:\\temp\\1.txt","w");
                before=0;
                groupnum=0;
                grouptextnumber=0;//第几个文件
                groupnum=0;//群组的第几条数据
                if ((fHandle=_findfirst("D:\\temp\\*.txt",&fa))==-1L)
               {
              printf("当前目录下没有txt文件\n");
              return 0;
               }
                else//如果成功打开了文件,先进行组名的保存
                    do
             {
                end=NULL;
                grouptextnumber=0;
                memset(begin2,0,sizeof(begin2));
                strcpy(begin2,begin3);
                end=strcat(begin2,fa.name);
                ok=1;
                fp=fopen(end,"r");
                for (i=0;i<strlen(fa.name)-4;i++)
                  groupname[groupnum][i]=fa.name[i];
                  groupname[groupnum][i]='\0';
                for (i=1;i<=8;i++)
                fgets(a,100,fp);
                  memset(a,0,sizeof(a));
                  memset(b,0,sizeof(b));
                  memset(c,0,sizeof(c));
                  memset(d,0,sizeof(d));
                  while(fscanf(fp,"%s%s%s%s\n",a,b,c,d)==4)
            {

                fgets(context[groupnum],5000,fp);//最后读空的
                context[groupnum][strlen(context[groupnum])]='\0';
                if (context[groupnum][4]=='-')
                    {
                    for (i=1;i<=strlen(context[groupnum]);i++)
                     ungetc(context[groupnum][strlen(context[groupnum])-i],fp);
                     continue;
                    }
               if (!ok)
                strcpy(groupname[groupnum],groupname[groupnum-1]);
                for (i=0;i<4;i++)
               year[groupnum][i]=a[i];
               year[groupnum][i]='\0';
                for (i=5;i<7;i++)
                month[groupnum][i-5]=a[i];
                for (i=8;i<10;i++)
                day[groupnum][i-8]=a[i];
                day[groupnum][i-8]='\0';//以上求年月日
                mbstowcs(temp,b,1000);
                if (findchinese(temp,shangwu))//判断上午下午
                        h=0;
                     else
                        h=12;
                     if (t=find(c,':',0))//判断时间
                     {
                         h1[groupnum]=0;
                         m1[groupnum]=0;
                         for (i=0;i<t;i++)
                            h1[groupnum]=h1[groupnum]*10+c[i]-'0';
                            h1[groupnum]=h1[groupnum]+h;
                          if (q=find(c,':',t+1))
                            for (i=t+1;i<q;i++)
                             m1[groupnum]=m1[groupnum]*10+c[i]-'0';
                      }
                     t=find(d,'(',0);
                     t1=find(d,')',0);
                      for (i=t+1;i<t1;i++)
                        QQ[groupnum][i-t-1]=d[i];
                        QQ[groupnum][i-t-1]='\0';


              calculate[groupnum]=strlen(groupname[groupnum])/2+strlen(QQ[groupnum])+strlen(year[groupnum])+strlen(month[groupnum])+strlen(day[groupnum])+strlen(context[groupnum])/2+8;
               ok=0;//判断是否有新文件
            printf("%s %s %s年 %s月 %s日  %d时 %d分 %s  %d \n",groupname[groupnum],QQ[groupnum],year[groupnum],month[groupnum],day[groupnum],h1[groupnum],m1[groupnum] ,context[groupnum],calculate[groupnum]);
           fprintf(fp1,"%s %s %s年 %s月 %s日  %d时 %d分 %s  %d \n",groupname[groupnum],QQ[groupnum],year[groupnum],month[groupnum],day[groupnum],h1[groupnum],m1[groupnum] ,context[groupnum],calculate[groupnum]);
              groupnum++;
            }
             textnumber[grouptextnumber]=0;
              for (i=before;i<groupnum;i++)
              textnumber[grouptextnumber]+=calculate[i];
              before=groupnum;
               printf("%d\n", textnumber[grouptextnumber++]);
              fprintf(fp1,"%d\n", textnumber[grouptextnumber-1]);
                fclose(fp);
        }
                while(_findnext(fHandle,&fa)==0);
               _findclose(fHandle);
               menu2();
               fclose(fp1);
               getchar();
               while(ch=getchar())
               {
               if (ch=='4')
               {
              printf("欢迎使用\n");
              return 0;
               }
               if (ch=='1')
               {
                scanf("%s",panduan);
                ok2=0;
                for (i=0;i<groupnum;i++)
                    if (strcmp(panduan,groupname[i])==0)
                    {
                    printf("%s %s %s年 %s月 %s日  %d时 %d分 %s  %d \n",groupname[i],QQ[i],year[i],month[i],day[i],h1[i],m1[i] ,context[i],calculate[i]);
                    ok2=1;
                    }
                    if (!ok2)
                        printf("没有该群组的消息\n");
                        menu2();
               }
                if (ch=='2')
                {

                scanf("%s",panduan);
                     ok2=0;
                    for (i=0;i<groupnum;i++)
                    if (strcmp(panduan,QQ[i])==0)
                    {
                           printf("%s %s %s年 %s月 %s日  %d时 %d分 %s  %d \n",groupname[i],QQ[i],year[i],month[i],day[i],h1[i],m1[i] ,context[i],calculate[i]);
                           ok2=1;
                    }
                      if (!ok2)
                        printf("没有该群组的消息\n");
                        menu2();
                }
                if (ch=='3')
                {
                    scanf("%s",panduan);
                    ok2=0;
                    for (i=0;i<groupnum;i++)
                        if (strstr(context[i],panduan))
                        {
                        printf("%s %s %s年 %s月 %s日  %d时 %d分 %s  %d \n",groupname[i],QQ[i],year[i],month[i],day[i],h1[i],m1[i] ,context[i],calculate[i]);
                        ok2=1;
                        }
                        if (!ok2)
                            printf("没有该条信息\n");
                        menu2();
                   }

               }

           }//以上为求群组的部分
           if (ch=='2')
           {
               before=0;
               memset(friendname,'\0',sizeof(friendname));
               friendtextnumber=0;
               friendnum=0;
                 if ((fHandle=_findfirst("D:\\temp2\\*.txt",&fa))==-1L)
               {
              printf("当前目录下没有txt文件\n");
              return 0;
               }
               else
               {
                   fp4=fopen("d://temp2//2.txt","w");
              do
               {
                   end=NULL;
                   memset(begin4,0,sizeof(begin4));
                   strcpy(begin4,begin5);
                   end=strcat(begin4,fa.name);
                   ok=1;
                 fp3=fopen(end,"r");
                  t=find(fa.name,'(',0);
                  t2=find(fa.name,')',0);
                  for (i=t+1;i<t2;i++)
                  friendname[friendnum][i-t-1]=fa.name[i];
                  friendname[friendnum][i-t-1]='\0';
                  for (i=1;i<=8;i++)
                  fgets(a,100,fp3);
                  memset(a,0,sizeof(a));
                  memset(b,0,sizeof(b));
                  memset(c,0,sizeof(c));
                  memset(d,0,sizeof(d));
                  while(fscanf(fp3,"%s%s%s%s\n",a,b,c,d)==4)
              {

                   fgets(context[friendnum],1000,fp3);//最后读空的
                    context[friendnum][strlen(context[friendnum])]='\0';
                    if (context[friendnum][4]=='-')
                    {
                    for (i=1;i<=strlen(context[friendnum]);i++)
                     ungetc(context[friendnum][strlen(context[friendnum])-i],fp3);
                     continue;
                    }

                   if (!ok)
                 strcpy(friendname[friendnum],friendname[friendnum-1]);
                 for (i=0;i<4;i++)
                year[friendnum][i]=a[i];
                year[friendnum][i]='\0';
                for (i=5;i<7;i++)
                month[friendnum][i-5]=a[i];
                for (i=8;i<10;i++)
                day[friendnum][i-8]=a[i];
                day[friendnum][i-8]='\0';//以上求年月日
                 mbstowcs(temp,b,1000);
                if (findchinese(temp,shangwu))//判断上午下午
                        h=0;
                     else
                        h=12;
                if (t=find(c,':',0))//判断时间
                     {
                         h1[friendnum]=0;
                         m1[friendnum]=0;
                         for (i=0;i<t;i++)
                            h1[friendnum]=h1[friendnum]*10+c[i]-'0';
                            h1[friendnum]=h1[friendnum]+h;
                           if (q=find(c,':',t+1))
                            for (i=t+1;i<q;i++)
                             m1[friendnum]=m1[friendnum]*10+c[i]-'0';
                      }

             calculate[friendnum]=strlen(friendname[friendnum])/2+strlen(year[friendnum])+strlen(month[friendnum])+strlen(day[friendnum])+strlen(context[friendnum])/2+8;
              ok=0;//判断是否有新文件
               printf("%s  %s年 %s月 %s日  %d时 %d分 %s  %d \n",friendname[friendnum],year[friendnum],month[friendnum],day[friendnum],h1[friendnum],m1[friendnum] ,context[friendnum],calculate[friendnum]);
            fprintf(fp4,"%s  %s年 %s月 %s日  %d时 %d分 %s  %d \n",friendname[friendnum],year[friendnum],month[friendnum],day[friendnum],h1[friendnum],m1[friendnum] ,context[friendnum],calculate[friendnum]);
                friendnum++;

            }
            strcpy(friendname[0],friendname[1]);
             textnumber[friendtextnumber]=0;//firendtexnumber是当前第几个
              for (i=before;i<friendnum;i++)
              textnumber[friendtextnumber]+=calculate[i];
              before=friendnum;
                printf("%d\n", textnumber[friendtextnumber++]);
              fprintf(fp4,"%d\n", textnumber[friendtextnumber-1]);
                fclose(fp3);

            }
                while(_findnext(fHandle,&fa)==0);
               _findclose(fHandle);
            }
            fclose(fp4);
               getchar();
               menu3();
               while(ch=getchar())
               {
               if (ch=='3')
               {
              printf("欢迎使用\n");
              return 0;
                }
               if (ch=='1')
               {
                scanf("%s",panduan);
                ok2=0;
                for (i=0;i<friendnum;i++)
                    if (strcmp(panduan,friendname[i])==0)
                    {
                    printf("%s %s %s年 %s月 %s日  %d时 %d分 %s  %d \n",friendname[i],QQ[i],year[i],month[i],day[i],h1[i],m1[i] ,context[i],calculate[i]);
                    ok2=1;
                    }
                    if (!ok2)
                        printf("没有该好友的消息\n");
                        menu3();
               }
                if (ch=='2')
                {
                    scanf("%s",panduan);
                    ok2=0;
                    for (i=0;i<friendnum;i++)
                        if (strstr(context[i],panduan))
                        {
                           printf("%s %s %s年 %s月 %s日  %d时 %d分 %s  %d \n",friendname[i],QQ[i],year[i],month[i],day[i],h1[i],m1[i] ,context[i],calculate[i]);
                           ok2=1;
                        }
                        if (!ok2)
                            printf("没有该条信息\n");
                              menu3();
                }

               }

           }
           }
                   return 0;
}


程序能满足超过8成的要求(不含有特殊标签)

我一开始把握的重点就出了问题,这个题目的重点并不是如何使用宽字符处理文本(事实上仅有少部分需要用到),而是如何切割,存储,看上去很简单,其实考虑到QQ聊天记录的多种情况并不简单(老师可能一开始也没这么多想...),先这样了~~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值