#include<stdio.h>
struct cz
{
int month;
float in;
float out;
}b[40]={0,0,0};
int k=0; //将循环体中的限制条件k 设为全局变量。
//k始终是你成功写入的次数。
void savedate(int k);
void loaddate();
void cheak();
main()
{
int input();
int i;
printf("如果你是第一次输入请留意是否有记录,如果有记录请先载入,再输入否则记录会被覆盖。\n\n\n");
for(;;)
{
printf("1.输入收入或支出。\n2.查询某月记录。\n3.读取数据。\n4.离开\n");
scanf("%d",&i);
if(i==1)
{
k=input(); //只写input()也可以。因为已经返回一个k值。
k++; //保证k始终是你成功写入的次数。
}
else
if(i==2)
cheak();
else
if(i==3)
loaddate();
else
break;
}
}
int input()
{
printf("请输入月份\n");
scanf("%d",&b[k].month); //注意其中的k为全局变量。
printf("请输入收入情况\n");
scanf("%f",&b[k].in);
printf("请输入支出情况\n");
scanf("%f",&b[k].out);
savedate(k+1); //将k加1传到函数savedate,因为savedate是void没有返回值,所以在input中k还是未加1前的值。
return(k);
}
void cheak()
{
int i,n;
float t=0;
printf("请输入要查询的月份:\n");
scanf("%d",&n);
printf("您此次的记录是:\n");
printf("月份\t收入\t支出\t总余额\n");
for(i=0;i<k;i++)
{
if(b[i].month==n)
{
printf("%3d\t%0.2f\t%0.2f\n",b[i].month,b[i].in,b[i].out);
}
}
for(i=0;i<k;i++)
{
if(b[i].month==n)
t=t+b[i].in-b[i].out;
}
printf("\t\t\t%0.2f\n",t);
}
void savedate(int k)
{
FILE *fp;
int i;
if((fp=fopen("count.txt","wb"))==NULL)
{
printf("cannot open file\n");
return;
}
fwrite(&k,sizeof(int),1,fp);//将你成功写入的次数k也写入文件。 这个语句的位置不能随便移动。为什么? 推测与读入顺序有关。
for(i=0;i<k;i++)
{
if(fwrite(&b[i],sizeof(struct cz),1,fp)!=1) //先写入文件在判断是否为真.
printf("file write error\n");
}
fclose(fp);
}
void loaddate()
{
FILE *fp;
int i;
if((fp=fopen("count.txt","rb"))==NULL)
{
printf("cannot open file\n");
return;
}
fread(&k,sizeof(int),1,fp); //读取之前成功写入的次数k。
printf("月份\t收入\t支出\n");
for(i=0;i<k;i++)
{
fread(&b[i],sizeof(struct cz),1,fp);
printf("%3d\t%0.2f\t%0.2f\n",b[i].month,b[i].in,b[i].out); //读取之前的数据,特别注意,打开文件不等于读取文件。打开之后不读,数据则不会还原。
}
fclose(fp);
}
问题主要是在void savedate(int k)函数中将 fwrite(&k,sizeof(int),1,fp);放到fclose(fp);前时程序会出错了。为什么。
白板的微信
相关分类