- 论坛徽章:
- 0
|
我在 Hp unix平台协的程序(B.11.11 U 9000/800)
aCC 编译,程序没有联合体,也没类型转换,处理文件时运行中,出现了这个错误,错误发生时读文件的内容不同。单错误发生的位置都是 226行,
请各位帮帮忙看看。
/********************************
* 查重程序 v0.1
* XXXXXX
*
*
*********************************/
#include <stdio.h>;
#include <string.h>;
#include <stdlib.h>;
#include <stdarg.h>;
#include <sys/time.h>;
#include <stddef.h>;
#include <unistd.h>;
/********** 重单号码检测*************/
struct type_SMT_list{
char smsSeq[20+1];
char appDatetime[14+1];
type_SMT_list *p;
};
struct type_SMT_dub{
char phoneNo[6+1];
type_SMT_list *plist;
type_SMT_dub *p;
};
typedef struct{
type_SMT_dub * p_SMT;
}typeSMT;
/********** 重单号码检测*************/
struct type_SMC_list{
char spCode[6+1];
char thirdDn[11+1];
char operCode[10+1];
char appMonth[6+1];
type_SMC_list *p;
};
struct type_SMC_dub{
char phoneNo[6+1];
type_SMC_list *plist;
type_SMC_dub *p;
};
typedef struct{
type_SMC_dub *p_SMC;
}typeSMC;
//========================================================================
int getTextField(const char *buf,char *Dest,int fn)
{
int j = 0;
for (int i =1 ; i<fn ; i++)
{
buf = strchr(buf,'|');
if (buf == NULL)
{
return -1;
}
buf++;
}
while (((*Dest = *buf) != '|') && (*buf !='\0') && (*buf !='\n') )
{
Dest++;
buf++;
}
*Dest = '\0';
return 0;
}
//========================================================================
void initSMTDUB(typeSMT ** pSMTDUB)
{
int i;
( * pSMTDUB ) = new typeSMT[100000];
if( * pSMTDUB == NULL ) throw "Can't new typeSMT";
for(i=0;i<100000;i++)
{
(*pSMTDUB).p_SMT = NULL ;
/*杜绝“野指针”
任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。
所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存
char *p = NULL;
char *str = (char *) malloc(100);
*/
}
}
//========================================================================================
void delSMTDUB(typeSMT * pSMTDUB)
{
int i;
type_SMT_dub * up;
type_SMT_dub * tup;
type_SMT_list *oplist;
type_SMT_list *toplist;
for(i=0;i<100000;i++)
{
up = pSMTDUB.p_SMT;
while( up != NULL )
{
oplist = up->;plist;
while ( oplist != NULL )
{
toplist = oplist->;p ;
delete oplist;
oplist = toplist;
}
tup = up->;p ;
delete up;
up = tup;
}
}
delete [] pSMTDUB ;
}
//========================================================================
void initSMCDUB(typeSMC ** pSMCDUB)
{
int i;
( * pSMCDUB ) = new typeSMC[100000];
if( * pSMCDUB == NULL ) throw "Can't new typeSMC";
for(i=0;i<100000;i++)
{
(*pSMCDUB).p_SMC = NULL ;
/*杜绝“野指针”
任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。
所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存
char *p = NULL;
char *str = (char *) malloc(100);
*/
}
}
//========================================================================================
void delSMCDUB(typeSMC * pSMCDUB)
{
int i;
type_SMC_dub * up;
type_SMC_dub * tup;
type_SMC_list *oplist;
type_SMC_list *toplist;
for(i=0;i<100000;i++)
{
up = pSMCDUB.p_SMC;
while( up != NULL )
{
oplist = up->;plist;
while ( oplist != NULL )
{
toplist = oplist->;p ;
delete oplist;
oplist = toplist;
}
tup = up->;p ;
delete up;
up = tup;
}
}
delete [] pSMCDUB ;
}
//=======================================================================
int addToSMT( type_SMT_dub **pSMT ,char *v_SMS_SEQ,char *v_SERV_NUMBER,char *v_start_date)
{
type_SMT_dub **p;
type_SMT_list **psmTlist;
for(p=pSMT;(*p)!=NULL;p=&((*p)->;p))
{
if( strncmp((*p)->;phoneNo,v_SERV_NUMBER,6) == 0 )
{
for(psmTlist=&((*p)->;plist);(*psmTlist)!=NULL;psmTlist=&((*psmTlist)->;p))
{
if(strncmp((*psmTlist)->;smsSeq,v_SMS_SEQ,20) == 0 &&
strncmp((*psmTlist)->;appDatetime,v_start_date,14) == 0)
{
return 1; //存在重复记录
}
}
//===========不存在,加上
(* psmTlist) = new type_SMT_list;
memset((*psmTlist)->;smsSeq,0,sizeof((*psmTlist)->;smsSeq));
memcpy((*psmTlist)->;smsSeq,v_SMS_SEQ,20);
(*psmTlist)->;smsSeq[20] = '\0';
memset((*psmTlist)->;appDatetime,0,sizeof((*psmTlist)->;appDatetime));
memcpy((*psmTlist)->;appDatetime,v_start_date,14);
(*psmTlist)->;appDatetime[14] = '\0';
(*psmTlist)->;p = NULL;
return 0;
}
}
(*p) = new type_SMT_dub ;
memset((*p)->;phoneNo,0,sizeof((*p)->;phoneNo));
memcpy((*p)->;phoneNo,v_SERV_NUMBER,6);
(*p)->;phoneNo[6]='\0';
psmTlist=&((*p)->;plist);
(*psmTlist) = new type_SMT_list;
memset((*psmTlist)->;smsSeq,0,sizeof((*psmTlist)->;smsSeq));
memcpy((*psmTlist)->;smsSeq,v_SMS_SEQ,20);
(*psmTlist)->;smsSeq[20] = '\0';
memset((*psmTlist)->;appDatetime,0,sizeof((*psmTlist)->;appDatetime));
memcpy((*psmTlist)->;appDatetime,v_start_date,14);
(*psmTlist)->;appDatetime[14] = '\0';
(*psmTlist)->;p = NULL;
return 0;
}
//=======================================================================
int addToSMC( type_SMC_dub **pSMC,char *v_SERV_NUMBER,char *v_SP_CODE,
char *v_THIRD_DN,char *v_operCode,char *v_month)
{
type_SMC_dub **p;
type_SMC_list **psmClist;
for(p=pSMC; (*p)!=NULL; p=&((*p)->;p) )
{//13782638858 901508 13782638858 "+MCHAT " 200508
if( strncmp((*p)->;phoneNo,v_SERV_NUMBER,6) == 0 )
{
for(psmClist=&((*p)->;plist);(*psmClist)!=NULL;psmClist=&((*psmClist)->;p))
{
if(strncmp((*psmClist)->;spCode,v_SP_CODE,6) == 0 &&
strncmp((*psmClist)->;thirdDn,v_THIRD_DN,11) == 0 &&
strncmp((*psmClist)->;operCode,v_operCode,10) == 0 &&
strncmp((*psmClist)->;appMonth,v_month,6) == 0 )
{
return 1; //存在重复记录
}
}
//===========不存在,加上
(* psmClist) = new type_SMC_list;
memset((*psmClist)->;spCode,0,sizeof((*psmClist)->;spCode));
memcpy((*psmClist)->;spCode,v_SP_CODE,6);
(*psmClist)->;spCode[6] = '\0';
memset((*psmClist)->;thirdDn,0,sizeof((*psmClist)->;thirdDn));
memcpy((*psmClist)->;thirdDn,v_THIRD_DN,11);
(*psmClist)->;thirdDn[11] = '\0';
memset((*psmClist)->;operCode,0,sizeof((*psmClist)->;operCode));
memcpy((*psmClist)->;operCode,v_operCode,10);
(*psmClist)->;operCode[10] = '\0';
memset((*psmClist)->;appMonth,0,sizeof((*psmClist)->;appMonth));
memcpy((*psmClist)->;appMonth,v_month,6);
(*psmClist)->;appMonth[6] = '\0';
(*psmClist)->;p = NULL;
return 0;
}
}
(*p) = new type_SMC_dub ;
memset((*p)->;phoneNo,0,sizeof((*p)->;phoneNo));
memcpy((*p)->;phoneNo,v_SERV_NUMBER,6);
(*p)->;phoneNo[6]='\0';
psmClist=&((*p)->;plist);
(* psmClist) = new type_SMC_list;
memset((*psmClist)->;spCode,0,sizeof((*psmClist)->;spCode));
memcpy((*psmClist)->;spCode,v_SP_CODE,6);
(*psmClist)->;spCode[6] = '\0';
memset((*psmClist)->;thirdDn,0,sizeof((*psmClist)->;thirdDn));
memcpy((*psmClist)->;thirdDn,v_THIRD_DN,11);
(*psmClist)->;thirdDn[11] = '\0';
memset((*psmClist)->;operCode,0,sizeof((*psmClist)->;operCode));
memcpy((*psmClist)->;operCode,v_operCode,10);
(*psmClist)->;operCode[10] = '\0';
memset((*psmClist)->;appMonth,0,sizeof((*psmClist)->;appMonth));
memcpy((*psmClist)->;appMonth,v_month,6);
(*psmClist)->;appMonth[6] = '\0';
(*psmClist)->;p = NULL;
return 0;
}
//========================================================================
int main(int argc,char * argv [])
{
char inpath[256];
char outpath[256];
char filename[256];
char infilename[256];
char outfilename[256];
char SMCfilename[256];
char SMTfilename[256];
char detailSMCfilename[256];
char detailSMTfilename[256];
char buf[1024];
FILE *fpin;
FILE *fpout;
FILE *fpsmc;
FILE *fpsmt;
FILE *fpdetailsmc;
FILE *fpdetailsmt;
typeSMT * pSMTDUB;
typeSMC * pSMCDUB;
type_SMT_list *psmTlist;
type_SMC_list *psmClist;
//================================
char v_USER_CHRG_TYPE[2+1];
char v_SERV_NUMBER[11+1];
char v_SMS_SEQ[20+1];
char v_APPLY_DATE[8+1];
char v_APPLY_TIME[6+1];
char v_start_date[14+1];
//=============================
char v_SP_CODE[6+1];
char v_THIRD_DN[11+1];
char v_operCode[10+1];
char v_month[6+1];
//===============================
char tail[10+1];
int index =0;
if( argc != 4 )
{
printf("Usage: %s INPATH INFILENAME OUTPATH\n",argv[0]);
printf("Examp: %s /home6/MONNET/out/TOBILLDUB 200508TO.R /home6/MONNET/out/TOBILL\n",argv[0]);
exit(1);
}
sprintf(inpath,"%s",argv[1]);
sprintf(filename,"%s",argv[2]);
sprintf(outpath,"%s",argv[3]);
sprintf(infilename,"%s/%s",inpath,filename);
sprintf(outfilename,"%s/%s",outpath,filename);
sprintf(SMCfilename,"%s/SMC_DUB_%s",outpath,filename);
sprintf(SMTfilename,"%s/SMT_DUB_%s",outpath,filename);
sprintf(detailSMCfilename,"%s/SMC_DETAIL_%s",outpath,filename);
sprintf(detailSMTfilename,"%s/SMT_DETAIL_%s",outpath,filename);
try
{
initSMTDUB(&pSMTDUB);
initSMCDUB(&pSMCDUB);
if((fpin=fopen(infilename,"r" ) == NULL)
{
memset(buf,0,sizeof(buf));
sprintf(buf,"Can't open file %s for read !\n",infilename);
throw buf;
}
if((fpout=fopen(outfilename,"w" ) == NULL)
{
memset(buf,0,sizeof(buf));
sprintf(buf,"Can't open file %s for read !\n",outfilename);
throw buf;
}
//===========================================================
if((fpsmc=fopen(SMCfilename,"w" ) == NULL)
{
memset(buf,0,sizeof(buf));
sprintf(buf,"Can't open file %s for read !\n",SMCfilename);
throw buf;
}
if((fpsmt=fopen(SMTfilename,"w" ) == NULL)
{
memset(buf,0,sizeof(buf));
sprintf(buf,"Can't open file %s for read !\n",SMTfilename);
throw buf;
}
//===========================================================
if((fpdetailsmc=fopen(detailSMCfilename,"w" ) == NULL)
{
memset(buf,0,sizeof(buf));
sprintf(buf,"Can't open file %s for read !\n",detailSMCfilename);
throw buf;
}
if((fpdetailsmt=fopen(detailSMTfilename,"w" ) == NULL)
{
memset(buf,0,sizeof(buf));
sprintf(buf,"Can't open file %s for read !\n",detailSMTfilename);
throw buf;
}
//=========================================================
while(memset(buf,0,sizeof(buf)),fgets(buf,1024,fpin)!=NULL)
{
memset(v_USER_CHRG_TYPE,0,sizeof(v_USER_CHRG_TYPE));
memset(v_SMS_SEQ,0,sizeof(v_SMS_SEQ));
memset(v_SERV_NUMBER,0,sizeof(v_SERV_NUMBER));
memset(v_APPLY_DATE,0,sizeof(v_APPLY_DATE));
memset(v_APPLY_TIME,0,sizeof(v_APPLY_TIME));
memset(v_start_date,0,sizeof(v_start_date));
//========================================
memset(v_SP_CODE,0,sizeof(v_SP_CODE));
memset(v_THIRD_DN,0,sizeof(v_THIRD_DN));
memset(v_operCode,0,sizeof(v_operCode));
memset(v_month,0,sizeof(v_month));
//========================================
getTextField(buf,v_USER_CHRG_TYPE,14); //取计费标志(包月’按条)
getTextField(buf,v_SERV_NUMBER,9); //号码
getTextField(buf,v_APPLY_DATE,24);
memset(tail,0,sizeof(tail));
memcpy(tail,&v_SERV_NUMBER[6],5); //取号码的后五位
tail[5]='\0';
index=atoi(tail);
printf("v_USER_CHRG_TYPE[%s] v_SERV_NUMBER[%s]\n", v_USER_CHRG_TYPE,v_SERV_NUMBER);
if( strncmp(v_USER_CHRG_TYPE,"02",2) == 0) //按条
{
getTextField(buf,v_SMS_SEQ,6); //短消息序列号
getTextField(buf,v_APPLY_TIME,25);
sprintf(v_start_date,"%s%s",v_APPLY_DATE,v_APPLY_TIME);
if( addToSMT( &(pSMTDUB[index].p_SMT),v_SMS_SEQ,v_SERV_NUMBER,v_start_date) ==1) //有重复记录
{
fprintf(fpsmt,"%20s,%11s,%14s\n",v_SMS_SEQ,v_SERV_NUMBER,v_start_date);
fprintf(fpdetailsmt,"%s",buf);
}
else
fprintf(fpout,"%s",buf);
}
else
{
getTextField(buf,v_SP_CODE,10); // SP_CODE
getTextField(buf,v_THIRD_DN,11); // 第三方号码
getTextField(buf,v_operCode,13); // 业务代码
strncpy(v_month,v_APPLY_DATE,6); // 得到话单的月份
v_month[6] ='\0';
if( addToSMC( &(pSMCDUB[index].p_SMC),v_SERV_NUMBER,v_SP_CODE,
v_THIRD_DN,v_operCode,v_month) ==1) //有重复记录
{
fprintf(fpsmc,"%11s,%6s,%11s,%10s,%6s\n",v_SERV_NUMBER,v_SP_CODE, v_THIRD_DN,v_operCode,v_month);
fprintf(fpdetailsmc,"%s",buf);
}
else
fprintf(fpout,"%s",buf);
}
}
fclose(fpin);
fclose(fpout);
fclose(fpsmc);
fclose(fpsmt);
fclose(fpdetailsmc);
fclose(fpdetailsmt);
delSMTDUB( pSMTDUB);
delSMCDUB( pSMCDUB);
}catch(char * errMsg)
{
printf("程序异常中断:\n%s\n,开始释放内存\n",errMsg);
/*释放内存*/
fclose(fpin);
fclose(fpout);
fclose(fpsmc);
fclose(fpsmt);
fclose(fpdetailsmc);
fclose(fpdetailsmt);
delSMTDUB( pSMTDUB);
delSMCDUB( pSMCDUB);
return -1;
}
return 0;
} |
|