#include<stdio.h>
#define Day 10
#define Event 20
typedef struct{
int id=0;
char day[Day];
char event[Event];
float zf;//支出或收入
float balance;
}Zhanghu;
void br(){
printf("\n\n");
}
void save(Zhanghu a){
FILE *fp;
fp=fopen("XX.txt","ab");
fwrite(&a,sizeof(Zhanghu),1,fp);
fclose(fp);
}
void duqu(){//显示全部账单
FILE *fp;
Zhanghu s;
fp=fopen("XX.txt","rb");
if(fp==NULL){
printf("open file error!");
return;
}
while(!feof(fp)){
fread(&s, sizeof(Zhanghu), 1, fp);
printf("\n流水号码:%d",s.id);
printf("\n日期:%s",s.day);
printf("\n事件:%s",s.event);
printf("\n支出或收入:%f",s.zf);
printf("\n余额:%f",s.balance);
}
fclose(fp);
}
void add(Zhanghu &a){//添加账单
printf("请输入发生日期(例如:2020-05-08)\n:");
scanf("%s",&a.day);
printf("请输发生事件\n:");
scanf("%s",&a.event);
printf("请输入发生金额(正+的表示收入,负-表示支出)\n:");
scanf("%f",&a.zf);
a.balance=a.balance+a.zf;
a.id++;
save(a);//保存到文本中
}
void showlate(){//查看最后的账单
FILE *fp;
Zhanghu s;
fp=fopen("XX.txt","rb");
if(fp==NULL){
printf("open file error!");
return;
}
while(feof(fp)==0){
fread(&s, sizeof(Zhanghu), 1, fp);
if(feof(fp)!=0){
printf("\n流水号码:%d",s.id);
printf("\n日期:%s",s.day);
printf("\n事件:%s",s.event);
printf("\n支出或收入:%f",s.zf);
printf("\n余额:%f",s.balance);
}
}
fclose(fp);
}
void showyue(){//查看余额
FILE *fp;
Zhanghu s;
fp=fopen("XX.txt","rb");
if(fp==NULL){
printf("open file error!");
return;
}
while(feof(fp)==0){
fread(&s, sizeof(Zhanghu), 1, fp);
if(feof(fp)!=0){
printf("\n余额:%f",s.balance);
}
}
fclose(fp);
}
int mianban(){//面板
int i=0;
while(1){
printf("\t0,退出\n");
printf("\t1,添加新收入或支出信息\n");
printf("\t2,显示所有记录列表\n");
printf("\t3,查询最后一条记录\n");
printf("\t4,查看实时余额\n");
scanf("%d",&i);
if(i>-1&&i<5)
return i;
else printf("输入错误!请重新输入!\n");
}
}
int main(){
Zhanghu l;
int yiz;//判断是否结束程序
do{
yiz=mianban();
switch(yiz){
case 1: add(l);
break;
case 2: duqu();
break;
case 3: showlate();
break;
case 4: showyue();
break;
}
br();
}while(yiz!=0);//yiz等于0就退出程序
return 0;
}
为什么最后一个账单会输出两次
而且每一个账单的日期后面总会跟着事件
求求了!!!!