fopen函数,写的一个经济收入支出管理系统怎么无法保存输入信息。
求优化 ,求修改 ,求找错。程序代码:
#include"stdio.h" #include"string.h" #include"stdlib.h" #include"math.h" #define TIAOSHU 100 #define CHENGGONG 1 #define SHIBAI 0 #define SHOURU 1 #define ZHICHU 2 #define ZENGJIA 1 #define SHANCHU 2 #define XIUGAI 3 #define CHAXUN 4 #define TONGJI 5 #define TUICHU 6 /*以下定义全局变量*/ struct shouzhixinxi { char xingming[20]; char laiyuan[40]; char riqi[20]; char shumu[10]; /*用double貌似读不出来*/ }jilu[TIAOSHU]; /*定义收支情况结构体,TIAOSHU表示最大的容量,可自行更改*/ char xuanze; /*该数据用于接收选择信息*/ int tishi; /*用于接收各函数返回的提示信息*/ int dijitiao=0; /*用于表示当前是第几条信息*/ int i; /*用于存放临时的条数,相当于零食的dijitiao*/ char linshi[40]; double linshi2; /*用于存放一些临时信息*/ /*代码*/ /*用于保存信息*/ void baocun() { FILE *fp; fp=fopen("shouzhiguanli.txt","w+"); for(i=0;i<dijitiao;i++) { fprintf(fp,"%s ",*jilu[i].xingming); fprintf(fp,"%s ",*jilu[i].laiyuan); fprintf(fp,"%s ",*jilu[i].riqi); fprintf(fp,"%s ",*jilu[i].shumu); } fclose(fp); } /*用于输出查询到的信息*/ int shuchu(int i) { printf("\n\n \37~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\37\n"); printf(" \23 \3.收 支 人 员 姓 名:%-20s\23\n",jilu[i].xingming); printf(" \23 \3.收 支 来 源 或 去 向:%-17s\23\n",jilu[i].laiyuan); printf(" \23 \3.收 支 日 期:%-26s\23\n",jilu[i].riqi); printf(" \23 \3.收 支 数 目:%-26s\23\n",jilu[i].shumu); printf(" \36~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\36\n"); return CHENGGONG; } /*用于新建*/ void xinzeng(int dijitiao) { while(1) { printf("\n请输入收入或支出人员的姓名:"); scanf("%s",jilu[dijitiao].xingming); printf("\n请输入收入来源或支出去向:"); scanf("%s",jilu[dijitiao].laiyuan); printf("\n请输入收入或支出的日期:"); scanf("%s",jilu[dijitiao].riqi); printf("\n请输入收入或支出的数目:"); scanf("%s",jilu[dijitiao].shumu); printf("是否保存这条信息? <Y/N>\n"); xuanze=getch(); if(xuanze=='Y' || xuanze=='y') { dijitiao++; printf("保存成功\n"); } printf("是否继续添加新记录? <Y/N>\n"); xuanze=getch(); printf("\n"); if(xuanze=='N' || xuanze=='n') break; } } /*用于删除*/ void shanchu() { int xuhao=0,biaoshi[20]={-1}; while(1) { printf("\n请选择查询要删除的记录的方式: 1.姓名 2.来源或去向 3.日期 4.数目\n"); xuanze=getch(); xuanze=xuanze-48; switch(xuanze) { case 1: printf("请输入要查询的姓名:"); scanf("%s",linshi); for(i=0;i<dijitiao;i++) if(strcmp(jilu[i].xingming,linshi)==0) /*查询*/ { xuhao++; biaoshi[xuhao]=i; printf("\n\n%10d.->",xuhao); tishi=shuchu(i); } if(tishi!=CHENGGONG) printf("未找到相关记录\n"); break; case 2: printf("请输入要查询的来源或去向:"); scanf("%s",linshi); for(i=0;i<dijitiao;i++) if(strcmp(jilu[i].laiyuan,linshi)==0) /*查询*/ { xuhao++; biaoshi[xuhao]=i; printf("\n\n%10d.->",xuhao); tishi=shuchu(i); } if(tishi!=CHENGGONG) printf("未找到相关记录\n"); break; case 3: printf("请输入要查询的日期:"); scanf("%s",linshi); for(i=0;i<dijitiao;i++) if(strcmp(jilu[i].riqi,linshi)==0) /*查询*/ { xuhao++; biaoshi[xuhao]=i; printf("\n\n%10d.->",xuhao); tishi=shuchu(i); } if(tishi!=CHENGGONG) printf("未找到相关记录\n"); break; case 4: printf("请输入要查询的数目:"); scanf("%s",linshi); for(i=0;i<dijitiao;i++) if(strcmp(jilu[i].shumu,linshi)==0) { xuhao++; biaoshi[xuhao]=i; printf("\n\n%10d.->",xuhao); tishi=shuchu(i); } if(tishi!=CHENGGONG) printf("未找到相关记录\n"); break; default:printf("输入错误\n"); } printf("请输入记录左上角对应的序号:"); xuanze=getch(); printf("\n"); xuanze=xuanze-48; if(biaoshi[xuanze]!=-1 && xuanze<=xuhao && xuanze>0) { biaoshi[0]=biaoshi[xuanze]; printf("确认删除? <Y/N> \n"); xuanze=getch(); if(xuanze=='Y' || xuanze=='y') { strcpy(jilu[biaoshi[0]].xingming,"\0"); strcpy(jilu[biaoshi[0]].laiyuan,"\0"); strcpy(jilu[biaoshi[0]].riqi,"\0"); strcpy(jilu[biaoshi[0]].shumu,"\0"); printf("删除成功\n"); } } else printf("输入错误.\n"); printf("是否继续删除? <Y/N> \n"); xuanze=getch(); printf("\n"); if(xuanze=='N' || xuanze=='n') break; } } /*用于修改*/ void xiugai() { struct shouzhixinxi linshijilu; int xuhao=0,biaoshi[20]={-1}; while(1) { printf("\n请选择查询要修改的记录的方式: 1.姓名 2.来源或去向 3.日期 4.数目\n"); xuanze=getch(); xuanze=xuanze-48; switch(xuanze) { case 1: printf("请输入要查询的姓名:"); scanf("%s",linshi); for(i=0;i<dijitiao;i++) if(strcmp(jilu[i].xingming,linshi)==0) /*查询*/ { xuhao++; biaoshi[xuhao]=i; printf("\n\n%10d.->",xuhao); tishi=shuchu(i); } if(tishi!=CHENGGONG) printf("未找到相关记录\n"); break; case 2: printf("请输入要查询的来源或去向:"); scanf("%s",linshi); for(i=0;i<dijitiao;i++) if(strcmp(jilu[i].laiyuan,linshi)==0) /*查询*/ { xuhao++; biaoshi[xuhao]=i; printf("\n\n%10d.->",xuhao); tishi=shuchu(i); } if(tishi!=CHENGGONG) printf("未找到相关记录\n"); break; case 3: printf("请输入要查询的日期:"); scanf("%s",linshi); for(i=0;i<dijitiao;i++) if(strcmp(jilu[i].riqi,linshi)==0) /*查询*/ { xuhao++; biaoshi[xuhao]=i; printf("\n\n%10d.->",xuhao); tishi=shuchu(i); } if(tishi!=CHENGGONG) printf("未找到相关记录\n"); break; case 4: printf("请输入要查询的数目:"); scanf("%s",linshi); for(i=0;i<dijitiao;i++) if(strcmp(jilu[i].shumu,linshi)==0) { xuhao++; biaoshi[xuhao]=i; printf("\n\n%10d.->",xuhao); tishi=shuchu(i); } if(tishi!=CHENGGONG) printf("未找到相关记录\n"); break; default:printf("输入错误\n"); } printf("请输入记录左上角对应的序号:"); xuanze=getch(); xuanze=xuanze-48; if(biaoshi[xuanze]!=-1 && xuanze<=xuhao && xuanze>0) { biaoshi[0]=biaoshi[xuanze]; printf("\n请输入新姓名:"); scanf("%s",linshijilu.xingming); printf("\n请输入新收入来源或支出去向:"); scanf("%s",linshijilu.laiyuan); printf("\n请输入新收入或支出的日期:"); scanf("%s",linshijilu.riqi); printf("\n请输入新收入或支出的数目:"); scanf("%s",linshijilu.shumu); printf("确认修改? <Y/N> \n"); xuanze=getch(); if(xuanze=='Y' || xuanze=='y') { strcpy(jilu[biaoshi[0]].xingming,linshijilu.xingming); strcpy(jilu[biaoshi[0]].laiyuan,linshijilu.laiyuan); strcpy(jilu[biaoshi[0]].riqi,linshijilu.riqi); strcpy(jilu[biaoshi[0]].shumu,linshijilu.shumu); printf("修改成功\n"); } } else printf("输入错误.\n"); printf("是否继续修改? <Y/N> \n"); xuanze=getch(); printf("\n"); if(xuanze=='N' || xuanze=='n') break; } } /*用于查询*/ void chaxun(void) { while(1) { printf("\n请选择查询方式: 1.姓名 2.来源或去向 3.日期 4.数目\n"); xuanze=getch(); xuanze=xuanze-48; switch(xuanze) { case 1: printf("请输入要查询的姓名:"); scanf("%s",linshi); for(i=0;i<dijitiao;i++) if(strcmp(jilu[i].xingming,linshi)==0) /*查询*/ tishi=shuchu(i); if(tishi!=CHENGGONG) printf("未找到相关记录\n"); break; case 2: printf("请输入要查询的来源或去向:"); scanf("%s",linshi); for(i=0;i<dijitiao;i++) if(strcmp(jilu[i].laiyuan,linshi)==0) /*查询*/ tishi=shuchu(i); if(tishi!=CHENGGONG) printf("未找到相关记录\n"); break; case 3: printf("请输入要查询的日期:"); scanf("%s",linshi); for(i=0;i<dijitiao;i++) if(strcmp(jilu[i].riqi,linshi)==0) /*查询*/ tishi=shuchu(i); if(tishi!=CHENGGONG) printf("未找到相关记录\n"); break; case 4: printf("请输入要查询的数目:"); scanf("%s",linshi); for(i=0;i<dijitiao;i++) if(strcmp(jilu[i].shumu,linshi)==0) tishi=shuchu(i); if(tishi!=CHENGGONG) printf("未找到相关记录\n"); break; default:printf("输入错误\n"); } printf("是否继续查询? <Y/N>"); xuanze=getch(); if(xuanze=='N' || xuanze=='n') break; } } /*将字符串转换为浮点数*/ double zhuanhuan(char *str) { int zhengshu=0,xiaoshu=0,neixing=1,zhishu,zhengfu=1; double jieguo=0; zhengshu=strlen(str); switch(str[0]) { case '-': str[0]='0'; zhengfu=-1; break; case '+': str[0]='0'; zhengfu=1; break; } for(i=0;str[i]!='\0';i++) if(str[i]='.') { zhengshu=i; break; } for(i=0;str[i]!='\0';i++) { if(str[i]!='.' && neixing==1) { zhishu=zhengshu-i-1; jieguo=jieguo+(str[i]-48)*pow(10,zhishu); } else { if(str[i]=='.') neixing=0; else { zhishu=i-zhengshu-1; jieguo=jieguo+(str[i]-48)*pow(10,zhishu); } } } if(zhengfu==-1) return -jieguo; return jieguo; } /*用于统计*/ void tongji(void) { double shumu=0,shumu2; char riqi1[10],riqi2[10]; while(1) { printf("\n请输入起始日期(含该日,年四位,月日两位):"); scanf("%s",riqi1); printf("\n请输入截止日期(含该日,年四位,月日两位):"); scanf("%s",riqi2); if(strcmp(riqi1,riqi2)<0) for(i=0;i<dijitiao;i++) if(strcmp(riqi1,jilu[i].riqi)<=0 && strcmp(riqi2,jilu[i].riqi)>=0) { shumu2=zhuanhuan(jilu[i].shumu); shumu=shumu+shumu2; } else printf("输入有误.\n"); printf("\n该时间段内总收支情况为:%.2f\n",shumu); printf("\n是否继续统计? <Y/N> "); xuanze=getch(); printf("\n"); if(xuanze=='N' || xuanze=='n') break; } } /*导入文件上的信息,相当于初始化*/ int daoruxinxi() { FILE *fp; if((fp=fopen("shouzhiguanli.txt","r+"))==NULL) { printf("当前收支情况文件不存在.\n"); if((fp=fopen("shouzhiguanli.txt","w+"))==NULL) { printf("未知错误导致未能建立新文件,按任意键结束程序.\n"); getch(); exit(0); } else { fclose(fp); printf("建立新文件成功,是否开始新建记录. <Y\\N>\n"); xuanze=getch(); if(xuanze=='Y' || xuanze=='y') xinzeng(dijitiao); } } else { for(dijitiao=0;(dijitiao<TIAOSHU && !feof(fp));dijitiao++) { fscanf(fp,"%s ",jilu[dijitiao].xingming); fscanf(fp,"%s ",jilu[dijitiao].laiyuan); fscanf(fp,"%s ",jilu[dijitiao].riqi); fscanf(fp,"%s ",jilu[dijitiao].shumu); } fclose(fp); return CHENGGONG; } return SHIBAI; } /*主函数*/ void main() { if(daoruxinxi()==CHENGGONG) /*若导入成则开始主菜单*/ { int xunhuan=1; /*用于控制循环*/ while(xunhuan) { printf("\n\n\n \37~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\37\n"); /*以下输出提示信息*/ printf(" \23 导 入 收 支 情 况 成 功. \23\n"); printf(" \23~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\23\n"); printf(" \23 \1 1. 增 加 新 记 录 \23\n"); printf(" \23 \1 2. 删 除 已 有 记 录 \23\n"); printf(" \23 \1 3. 修 改 已 有 记 录 \23\n"); printf(" \23 \1 4. 查 询 已 有 记 录 \23\n"); printf(" \23 \1 5. 统 计 一 段 时 间 内 的 数 据 \23\n"); printf(" \23 \1 6. 退 出 该 系 统 \23\n"); printf(" \36~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\36\n\n"); printf("请选择要执行的操作:"); xuanze=getch(); /*选择操作*/ xuanze=xuanze-48; /*前面接收的是1的ASC码实际上是49而不是1,转换一下*/ switch(xuanze) { case ZENGJIA:xinzeng(dijitiao);break; case SHANCHU:shanchu();break; case XIUGAI:xiugai();break; case CHAXUN:chaxun();break; case TONGJI:tongji();break; case TUICHU:xunhuan=0;break; default:printf("输入错误.\n"); } } } baocun(); /*保存更改*/ }