1、使得malloc和fscanf函数在代码中只出现一次
PSSTUD get_stud_info1 (void) //使malloc和fscanf在代码中只出现一次
{
FILE * pf = fopen ("students.dat", "r");
if (pf == NULL)
{
printf ("File open failed.\n");
return NULL;
}
PSSTUD pre,cur,pstd=NULL;
int bfscf;
do
{
if((cur=malloc(sizeof(SSTUD)))==NULL)
{
printf ("Memory allocated failed.\n");
if(pstd!=NULL) destroy_stud_info (pstd);
return NULL;
}
else if(pstd==NULL&&cur!=NULL)
{
pstd=cur;
}
//cur->next=NULL;
bfscf=fscanf (pf, "%s%s%u%s%f", cur -> name,\
cur -> gender, & cur -> age,\
cur -> grade, & cur -> score);
if(cur==pstd&&bfscf==EOF)
{
printf ("Empty file.please append some records.\n");
free (pstd);
return NULL;
}else if(cur==pstd&&bfscf!=EOF){
pre=cur;
//cur=cur->next;
//continue;
}
if(bfscf!=EOF) //if(cur!=pstd&&bfscf!=EOF)
{
pre->next=cur;
pre=pre->next;
cur=cur->next;
}
}
while(bfscf!=EOF);
free(cur);
pre->next=NULL;
fclose(pf);
return pstd;
}
2、从标准输入获得信息,可重定位到文件exe < students.dat
PSSTUD get_stud_info2 (void) //标准输入获得信息
{
fprintf(stdout,"please enter 5 data: %-13s%-8s%-5s%-7s%-7s\n","Name<20byte","Gender","Age","Grade","Score");
printf("Gender: F/M/Female/Male\n");
printf("Grade: freshman/sophomore/junior/senior\n");
printf ("------------"\
"-------------------------------------------\n");
PSSTUD pre,cur,pstd=NULL;
int bfscf;
do
{
if((cur=malloc(sizeof(SSTUD)))==NULL)
{
printf ("Memory allocated failed.\n");
if(pstd!=NULL) destroy_stud_info (pstd);
return NULL;
}
else if(pstd==NULL&&cur!=NULL)
{
pstd=cur;
}
//cur->next=NULL;
bfscf=fscanf (stdin, "%s%s%u%s%f", cur -> name,\
cur -> gender, & cur -> age,\
cur -> grade, & cur -> score);
scanf("%*[^\n]");
//getchar();
if(cur==pstd&&bfscf!=5)
{
printf ("wrong data.please enter again.\n");
free (pstd);
pstd=NULL;
continue;
}
else if(cur==pstd&&bfscf!=EOF)
{
pre=cur;
//cur=cur->next;
//continue;
}
if(bfscf!=5&&bfscf!=EOF)
{
printf ("wrong data.please enter again.\n");
free(cur);
continue;
}
if(bfscf!=EOF) //if(cur!=pstd&&bfscf!=EOF)
{
pre->next=cur;
pre=pre->next;
cur=cur->next;
}
//if(getchar()=='\n')break;
}
while(bfscf!=EOF);
free(cur);
pre->next=NULL;
return pstd;
}