小金库—有密码,添账,列单,按日期、ID查询,删除的功能(初始密码为123456,可更改)

#include<stdio.h>
#include<string.h> 
#include<conio.h>            //问题:清除小金库进入不了函数,删除记录,新小金库// 
#include<stdlib.h>


long size;

struct LogData
{ 

long logid;

char logdate[11];

char lognote[15];

double charge; 

double balance; 

};


int inputchoice(void)

{

int mychoice;

printf("\n输入你的选择:\n");

printf("1-在原账目上添加添加新记录.\n2-列出所有账单.\n");

printf("3-按照ID查询记录\n");

printf("4-查找最后一次记录.\n5-删除小金库.\n6-创建新的小金库及其相关操作.\n7-按照日期查询记录.\n8-删除记录\n0-结束操作.\n");

scanf("%d",&mychoice);

return mychoice;

}


void  removefile(void)
{
    char filename[80];
    printf("输入要删除的文件:");
    //gets(filename);
    scanf("%s",filename);
    if( remove(filename))
        printf("can't delete the file %s",filename);
    else
        printf("OK");
}


long getLogcount(FILE *cfptr)

{

long begin,end,logcount;

fseek(cfptr,0L,0);

begin=ftell(cfptr);

fseek(cfptr,0,2);      

end=ftell(cfptr);

logcount=(end-begin)/size;

return logcount;

}

/*void correctlog(FILE*pp,int n)
{
    struct LogDate haa;
    fseek(pp,size*(n-1),0);
    fread(&haa,size,1,pp);
    printf("输入说明,金额");
    scanf("%s%ld",haa.) ;
}*/

void deleteLine(FILE* fpp, int d)     
{
    int n= getLogcount(fpp);
    struct LogData old[100];
    int i;
    for(i=1;i<=n;i++)
        fread(&old[i],size,1,fpp);
    for(i=0;(d+i)<n;i++)
    old[d+i]=old[d+i+1];
    old[i].charge=0.0;old[i].logid=0;
    fclose(fpp);
    fpp=fopen("cashbox.dat","rb+");
    rewind(fpp);
    for(i=1;i<n;i++)
    fwrite(&old[i],size,1,fpp); 

}     

void ListAllLog(FILE *cfptr)

{

struct LogData log;


fseek(cfptr,0L,0);

fread(&log,size,1,cfptr);

printf("        logid logdate lognote charge left\n     0      0       0       0\n");

while(!feof(cfptr))

{

printf("%6ld%11s%15s%10.2lf%10.2lf\n",log.logid,log.logdate,log.lognote,log.charge,log.balance);

fread(&log,size,1,cfptr);                      /*每次读完之后指针已经移动*/ 

}

}

void QueryLastLog(FILE *cfptr)

{

struct LogData log;

long logcount;

logcount=getLogcount(cfptr);       /*logcount是结构体个数*/ 

if(logcount>0)

{

fseek(cfptr,size*(logcount-1),0);

fread(&log,size,1,cfptr);

printf("最后一次记录是:\n");

printf("logid:%6ld\nlogdate:%11s\nlognote:15s\n",log.logid,log.logdate,log.lognote);

printf("charge:%10.2lf\nbalance:%10.2lf\n",log.logid,log.balance); 

}

else

printf("no logs in file!\n");

}



void querybyID(FILE *cfptr,int n)
{
    struct LogData logidd;
    fseek(cfptr,size*(n-1),0);              /*若第一条ID则不需要从第一条数据跳转,所以乘的是n-1,如第二条从第一条结尾开始读*/ 
    fread(&logidd,size,1,cfptr);
    printf("记录是(若查找的ID不存在则输出第一条ID):\n");

printf("logid:%6ld\nlogdate:%11s\nlognote:15s\n",logidd.logid,logidd.logdate,logidd.lognote);

printf("charge:%10.2lf\nbalance:%10.2lf\n",logidd.logid,logidd.balance); 

}




void AddNewLog(FILE *cfptr)

{

struct LogData log,lastlog;

long logcount;

printf("输入新记录日期(格式:2006-01-01):");

scanf("%s",log.logdate);

printf("输入备注:");

scanf("%s",log.lognote);

printf("输入金额:支出标负");

scanf("%lf",&log.charge);

logcount=getLogcount(cfptr);

if(logcount>0)

{

fseek(cfptr,size*(logcount-1),0);

fread(&lastlog,size,1,cfptr);

log.logid=lastlog.logid+1;

log.balance=log.charge+lastlog.balance;

}

else 

{

log.logid=1;

log.balance=log.charge;

}
putchar(10);

rewind(cfptr);

printf("logid=%ld\n",log.logid);

fwrite(&log,sizeof(struct LogData),1,cfptr);

}




void findbylogdate(FILE *cfptr,char a[])
{
    struct LogData logid2;     
    int i=1;
    while(!feof(cfptr))
    {
    fseek(cfptr,size*i,0);
    fread(&logid2,size,1,cfptr);
    if(strcmp(a,logid2.logdate)==0)
    {
        printf("logid:%6ld\nlogdate:%s\nlognote:%s\n",logid2.logid,logid2.logdate,logid2.lognote);

        printf("charge:%10.2lf\nbalance:%10.2lf\n",logid2.logid,logid2.balance); break;
    }
    i=i+1;
    }
    while(feof(cfptr))  printf("error");
}



void creatnewAu(void)
{
    FILE *ffp;
    char neww[20];
    printf("请输入你想创建金库的名称及其文件类型(.dat):\n");
    scanf("%s",neww);

    if((ffp=fopen(neww,"wb+"))==NULL)
    {
        printf("不能打开!\n");
        exit(0);
    }
    printf("\n输入你的选择2:\n");

    printf("1-在新账目上添加添加新记录.\n2-列出所有账单.\n");

    printf("3-按照ID查询记录\n");
    int choice2;
    scanf("%d",&choice2);
    switch(choice2)
    {
        case 1:
        AddNewLog(ffp);break;

        case 2:
            ListAllLog(ffp);break;
        case 3:
            {
            int n2;
            printf("请输入要查询的ID(若无此项则输出第一条ID):\n");
            scanf("%d",&n2); 
            querybyID(ffp,n2);
            }

    }

}


int main(void)

{

FILE *fp;

int choice;

printf("请输入密码:(五次机会)");
int times,code;
scanf("%d",&code);
for(times=1;times<=5;times++)
{
    if(code!=123456)
    {
        printf("密码错误,请重新输入: ");
        scanf("%d",&code); 
    }
    if(code==123456) break;
    if(times==5) return 0;
 }




if((fp=fopen("cashbox.dat","ab+"))==NULL)

{

printf("can not open a file!\n");

return 0;

}

size=sizeof(struct LogData);


while((choice=inputchoice())!=0)

{

switch(choice)

{

case 1:

AddNewLog(fp);break;

case 2:

ListAllLog(fp);break;

case 3:
{
int id;
printf("请输入要查询的ID:");
scanf("%d",&id);
querybyID(fp,id);break;
}
case 4:

QueryLastLog(fp);break;

case 5:
 removefile();break;

 case 6:
creatnewAu();break;

case 7:
{
char datt[15];
printf("请输入想要查询的日期:\n");
scanf("%s",datt);
findbylogdate(fp,datt);
}
break;

case 8:
{
int want;
printf("请输入想删除的ID:\n");
scanf("%d",&want);
deleteLine(fp,want);
}
break;

case 9:

printf("Input Error.");break;


}

}

fclose(fp);

return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值