从文件里得到所有的邮件地址(源代码)

    技术2022-05-11  100

    很想实现类似 php函数里的 ereg 功能.欢迎探讨

    /* * 从文件里得到邮件地址 2003-2-8 17:15 */#include <stdlib.h> #include <stdio.h> #define mailMaxLen 20#define bufMaxLen 200

    long filesize(FILE *stream) {  long curpos, length;  curpos = ftell(stream);  fseek(stream, 0L, SEEK_END);  length = ftell(stream);  fseek(stream, curpos, SEEK_SET);  return length; }

    int main(int argc,char *argv[]){ FILE *fp,*fp_write; int i,temp_len; int bool_find=0,bool_finished=0; long file_len=0; char fileName[30],write_file[30]; char mail_data[50];     //保存得到的临时邮件 char *buf; char *p,*mail_begin,*temp_p; if(argc!=2) { printf("error!/nExp: %s yourmail.dat/n",argv[0]);  return 0;  } sprintf(write_file, "tmp_%s", argv[1]);  //生成要写入的文件名 strcpy(fileName, argv[1]); if((fp=fopen(fileName,"rb"))==NULL) { printf("/nCan't open The file for %s to read! /n",fileName);   printf("Press any key to halt!");   return(0); }

     if((fp_write=fopen(write_file,"w"))==NULL) { printf("/nCan't open The file for %s to write! /n",fp_write);   printf("Press any key to halt!");   return(0); }

     file_len=filesize(fp); buf=(char *)malloc(file_len); fread(buf,file_len,1, fp); for(p=buf;*p!='/0';p++) {//  if(*p=='_' || *p=='.' || (*p>='0' && *p<='9') || (*p>='a' && *p<='z') || (*p>='A' && *p<='Z') )

      if(*p=='@')  {   bool_finished=0;   bool_find=0;   mail_begin=p;   temp_len=0;   while(temp_len<mailMaxLen && p!=buf)//后退,找到邮箱名   {    p--;//如果符合标准的    if(*p=='_' || *p=='-' ||  *p=='.' || (*p>='0' && *p<='9') || (*p>='a' && *p<='z') || (*p>='A' && *p<='Z'))    {     temp_len++;    }    else    {     break;    }   }   p++;//指向正确的开始//eregi("^[_/.0-9a-z-]+@([0-9a-z][0-9a-z-]+/.)+[a-z]{2,3}$",$email))    if(mail_begin!=p)   //符合条件了   {    temp_p=mail_begin;  //这时temp_p 指向@处    mail_begin=p;   //记录邮件名开始地址    p=++temp_p;    //p指向@后的第一个字符//    printf("%s %c","ok",*temp_p);

        //接下来的第1个字符应该是a-z 0-9 之间    while((*p>='0' && *p<='9') || (*p>='a' && *p<='z') || (*p>='A' && *p<='Z') && *p!='/0')    {     p++;     //紧接着应该是a-z -     if(*p=='-' || (*p>='0' && *p<='9')  || (*p>='a' && *p<='z') || (*p>='A' && *p<='Z'))     { p++;     }     else     { bool_find=0;      break;     }     temp_len=0;   //cd.digital@cfan.com.cn     while(temp_len<mailMaxLen && *p!='/0')     { if(*p=='-' || (*p>='0' && *p<='9')  || (*p>='a' && *p<='z') || (*p>='A' && *p<='Z'))      { p++;       temp_len++;      }//      else if(*p=='.')//找到点.了  +[a-z]{2,3}$      { bool_find++;//找到一段了       temp_p=p;  //temp_p 指向.所在的位置       p++;       break;      }      else      { bool_finished=1; //退出循环       break;      }     }//while(temp_len<mailMaxLen && *p!='/0')     if(bool_finished==1 && bool_find==0)//不符合      break;    }//while   }//   if(mail_begin!=p)   //符合条件了// ggg@chinatoolsnet.cnggg _w@163.net   if(bool_find>0)   {    p=temp_p;  //p退到最后一个.的位置    p=p+3;    if(!((*p>='a' && *p<='z') || (*p>='A' && *p<='Z'))) //最后的 .net 不符合    { p--;    }/*    for(temp_p=mail_begin;temp_p<=p;temp_p++)    { printf("%c",*temp_p);    }*///   strncpy(mail_data, mail_begin, 3);     fwrite(mail_begin, p-mail_begin+1, 1, fp_write);    fputc('/n',fp_write);//    printf("%c",'/n');    *p=' '; //这样做是为了下次检查时从此开始   }  }//  if(*p=='@')//  printf("%c",*p); }//for  fclose(fp); fclose(fp_write); free(buf); printf("/n--------------------/nok!"); printf("/nfile writed to '%s'!",write_file);

     return(0);}


    最新回复(0)