我去的时候就剩这个题目了,真坑啊~~
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聊天记录的多种情况并不简单(老师可能一开始也没这么多想...),先这样了~~