qq_37283655
我到底错哪了
2017-03-20 12:27
采纳率: 25%
浏览 546

c 用链表对文件读写错误

#include
#include
#include
struct data {
int year;
int month;
int day;

};
struct cost{
int yuan;
int jiao;
int fen;

};
struct treatment{
char pname[20];
char pid[19] ;
int age;
char dname[20];
int did;
int office;
float money;
struct data day0;
struct treatment *next;
};
//病人名字
int addpname( char y0[]){
int k0=1;
int i0;
while(k0){
k0=0;
printf("请输入病人名字(小写字母)\n");
scanf("%s",y0);
for(i0=0;i0 if(y0[i0]122){
k0=1;
printf("输入有误,请重新输入\n");
break; //注意break是否跳出for 对的
}
}

} 
    return 0;

}
//病人id
void addpid( char y1[20]){

int k1=1;
int i1;
while(k1){
    k1=0;
    printf("请输入病人身份证号\n");
    scanf("%s",y1);
    for(i1=0;i1<18;i1++){
        if(y1[i1]<48||y1[i1]>57&&y1[18]!=120)
        {
            k1=1;
            printf("输入有误,请重新输入\n");
            break; 

        }

    } 

} 

}
//医生名字
int adddname( char y2[20] ){
int k2=1;
int i2;

while(k2){
    k2=0;
    printf("请输入医生名字(小写字母)\n");
    scanf("%s",y2);
    for(i2=0;i2<strlen(y2);i2++){
        if(y2[i2]<97||y2[i2]>122){
            k2=1;
            printf("输入有误,请重新输入\n");
            break;
        }
    }


} 
return 0 ;

}
//医生工作号
int adddid(){
int i3;
int k3=1;
while(k3){
k3=0;
int y3;
fflush(stdin);
printf("请输入医生工作号\n");
y3=scanf("%d",&i3);
if(y3==EOF||0>i3||200 k3=1;
printf("输入有误,请重新输入\n");
// break; //Break使用有误导致缓冲区里有错误数据且给了下一个输入
}
}
return i3;
}
//判断日期
int adddata( int ydata[3]){
//存储日期
int i4; //i4表示年
int k4=1;
while(k4){
k4=0;
printf("请输入年份\n");
scanf("%d",&i4);
if(i4>2020||i4<2017){
k4=1;
printf("输入有误!请重新输入\n");
}
}

 int k5=1;  
 int i5;        //判断月
 while(k5){
    k5=0;
    printf("请输入月份(1-12)\n");
    scanf("%d",&i5);
    if(i5>12||i5<1){
        printf("输入有误!请重新输入\n");
        k5=1;
    }
  }
     int y5;        //月份天数上限
     switch(i5){
        case 1: case 3: case 5:case 7: case 8 : case 10: case 12 :y5=31;break;      
        case 4: case 6: case 9:case 11:y5=30;break;
        case 2:if(i4%4==0&&i4%100!=0||i4%400==0)
                  y5=29;
               else
                  y5=28;
                  break;
    }

     int k6=1;      //判断日期
     int  i6;
     while(k6){
        k6=0;
        printf("请输入日期(1-%d)\n",y5);//上限 
        scanf("%d",&i6);
        if(i6<1||i6>y5){

            k6=1;
            printf("输入有误!请重新输入\n");
        }
    } 
    ydata[0]=i4;
    ydata[1]=i5;
    ydata[2]=i6;
    return  0;
 }
 /*科室处理*/
 int addoffice(){
 int y7;
 int k7=1;
 while(k7){
    k7=0;
    printf("请选择科室\n");
    printf("1-神精科      2-精神科\n");
    printf("3-内     科     4-外    科\n");
    printf("5-小儿科\n");
    fflush(stdin);
    if(scanf("%d",&y7)==EOF||y7>5||y7<1){
        printf("输入有误!请重新输入\n");
        k7=1;
    }
} 
    return k7;

}
//钱的处
int addqian(){ //元
int k8=1;
int i8;
while(k8){
k8=0;
fflush(stdin);
if( scanf("%d",&i8)==EOF||i810000000){
k8=1;
printf("输入有误,请重新输入\n");
}

}
return i8;

}
int addqian2(){ //分 不能大于10
int k10=1;
int i10;
while(k10){
k10=0;
fflush(stdin);
if( scanf("%d",&i10)==EOF||i1010){
k10=1;
printf("输入有误,请重新输入\n");
}

}
return i10;

}
//病人的年龄
int addage(){
int k9=1;
int i9;
int y9;
while(k9){
k9=0;
printf("请输入整数\n");
fflush(stdin); //清除缓冲区内容
y9=scanf("%d",&i9); //getchar();只能清除一个字符
if(y9==EOF){ //判断scanf录入的是不是字母
printf("输入有误!请重新输入\n");
k9=1;

    } 


    if(i9<0||i9>300){
        printf("输入有误!请重新输入\n");
        k9=1;

    } 

}
return i9;

}
//增加函数
int realadd(struct treatment *bus0){
struct cost s;

addpname(bus0->pname);

addpid(bus0->pid);
printf("请输入病人的年龄") ;
bus0->age=addage();
adddname(bus0->dname);
bus0->did=adddid();
bus0->office=addoffice();
int yy[3]; //年月日
adddata(yy);
bus0->day0.year=yy[0];
bus0->day0.month= yy[1];
bus0->day0.day=yy[2];
printf("请输入病人消费情况\n");
printf("请输入元\n");
s.yuan=addqian();
printf("请输入角\n");
s.jiao=addqian2();
printf("请输入分\n");
s.fen=addqian2();
bus0->money=(float)s.yuan+0.1*(float(s.jiao ))+0.01*(float(s.fen ));

return 0;

}
//删除函数
int delete0(struct treatment * top){ ///用delete的话和编译器里的东西重名

char   key[6];
addpid(key);                               //输入关键字 
struct treatment *Sqian,*Shou;
Shou=top;
 while(Shou!=NULL){
     if(strcmp(key,Shou->pid)==0){
         if(Shou==top){                   //头
             Sqian=Shou;
             Shou=Shou->next;
             free(Sqian);
         }
         else if(Shou->next==NULL){        //尾
                Sqian=Shou;
                Shou=top;
                free(Sqian);
         }
         else {                            //中间
              Shou=Shou->next;
              free(Sqian->next);
              Sqian->next=Shou;

          }
     }//第一个if
     else {                               //向后走
         Sqian=Shou;  
         Shou=Shou->next;

     }
     return 0;

}
}
// 打印输出函数
void output0(struct treatment *bus1){
do{
printf("病人的名字%s\n",bus1->pname);
printf("病人的身份证%s\n",bus1->pid);
printf("病人的年龄%d\n",bus1->age);
printf("医生的名字%s\n",bus1->dname);
printf("医生的工作号%d\n",bus1->did);
printf("科室d%\n",bus1->office);
printf("开销总计%f\n",bus1->money);
printf("日期:%d 年%d 月%d 日\n",bus1->day0.year,bus1->day0.month,bus1->day0.day );
bus1=bus1->next;
}while(bus1!=NULL) ;

 }

//加载文件到链表 --------------------------------------------------------------------------------------------------------------
int wenjian(struct treatment *top0 ,struct treatment *rear){

FILE *fp0;
struct treatment *sp11;
fp0=fopen("D://source.txt","a+");
if(fp0==NULL){ //判断文件打开是否成功;
printf("打开文件错误");
return 0;
}
else{

    if(!feof(fp0)) {                  //头上加载 
            fread(top0,sizeof(struct treatment),1,fp0);
            top0->next=NULL;
            sp11=top0;
            while(!feof(fp0)){      //后面加 
                   sp11->next=(struct treatment *)malloc(sizeof(struct treatment ));
                   fread(sp11->next,sizeof(treatment),1,fp0);
                   sp11=sp11->next;
                    sp11->next=NULL;
            }
            rear=sp11;
        }
    else printf( "文件为空"); 
   fclose(fp0);
   printf("加载文件成功"); 
   return 1;
  }

}
//将链表写入文件--------------------------------------------------------------------------
int addw(struct treatment *head){ //加入尾
FILE *fp1;
struct treatment *sp22,*sbing;
sp22=head;
fp1=fopen("D://source.txt","a");
printf("DFJKL;") ;
if(fp1==NULL){ //判断打开是否成功
printf("打开文件有误");
return 0;
}
else if(strlen(head->pname)!=0){ //加入一个判断来确定链表是否为空
do{
printf("kaishi"); //写入
fwrite(sp22,sizeof( struct treatment),1,fp1);
sbing=sp22;
sp22=sp22->next;
}while(sbing!=NULL);//注意条件是否错误
}

else
printf("sssssssssssssssssssssssssssssssssssssssss");
fclose(fp1);
return 1;
}
//增加信息到链表--------------------------------------------------------------------------------------
int addolian(struct treatment *head3,struct treatment *rear3){
printf("开始加载信息");
printf( " %d dsfsdgsag ",strlen(head3->pname)) ;

if(strlen(head3->pname)==0){ //为什么等于3
realadd(head3);
head3->next=NULL;
}
else{
rear3->next=(struct treatment *)malloc(sizeof(struct treatment));
rear3=rear3->next;
realadd(rear3);
rear3->next=NULL;
}
}
int main(){
struct treatment *head0,*rear0,*sbing0,*bianli0;
head0=(struct treatment *)malloc(sizeof(treatment));
rear0=head0;
wenjian(head0,rear0);
int i;
while(1){
printf("选择相应功能前的数字\n") ;
printf("1-增加病人信息 2-输出所有病人信息\n");
printf("3-添加到文件 4-删除某病人的信息 \n");
i=addage();
switch(i){
case 1:addolian(head0,rear0);break;
case 2:output0(head0);break;
case 3:addw(head0);break;
case 4:delete(head0);break;
}
}
return 0; //后面对文件操作的几个函数有问题 ------------------------ //

}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

相关推荐