#include<stdio.h>struct cz{int month;float in;float out;}b[40]={0,0,0};int k=0; //將循環(huán)體中的限制條件k 設(shè)為全局變量。//k始終是你成功寫入的次數(shù)。 void savedate(int k);void loaddate();void cheak();main(){ int input();int i;printf("如果你是第一次輸入請(qǐng)留意是否有記錄,如果有記錄請(qǐng)先載入,再輸入否則記錄會(huì)被覆蓋。\n\n\n");for(;;){ printf("1.輸入收入或支出。\n2.查詢某月記錄。\n3.讀取數(shù)據(jù)。\n4.離開(kāi)\n");scanf("%d",&i);if(i==1){k=input(); //只寫input()也可以。因?yàn)橐呀?jīng)返回一個(gè)k值。k++; //保證k始終是你成功寫入的次數(shù)。 }elseif(i==2)cheak();elseif(i==3)loaddate();elsebreak;}}int input(){ printf("請(qǐng)輸入月份\n");scanf("%d",&b[k].month); //注意其中的k為全局變量。printf("請(qǐng)輸入收入情況\n");scanf("%f",&b[k].in);printf("請(qǐng)輸入支出情況\n");scanf("%f",&b[k].out);savedate(k+1); //將k加1傳到函數(shù)savedate,因?yàn)閟avedate是void沒(méi)有返回值,所以在input中k還是未加1前的值。return(k);} void cheak(){int i,n;float t=0;printf("請(qǐng)輸入要查詢的月份:\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);//將你成功寫入的次數(shù)k也寫入文件。 這個(gè)語(yǔ)句的位置不能隨便移動(dòng)。為什么? 推測(cè)與讀入順序有關(guān)。 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); //讀取之前成功寫入的次數(shù)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); //讀取之前的數(shù)據(jù),特別注意,打開(kāi)文件不等于讀取文件。打開(kāi)之后不讀,數(shù)據(jù)則不會(huì)還原。}fclose(fp);}問(wèn)題主要是在void savedate(int k)函數(shù)中將 fwrite(&k,sizeof(int),1,fp);放到fclose(fp);前時(shí)程序會(huì)出錯(cuò)了。為什么。
1 回答

白板的微信
TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊
fwrite(&k,sizeof(int),1,fp)
k 是記錄的個(gè)數(shù),
本句是在文件中“第一個(gè)字”寫入 一整形數(shù)標(biāo)記了本文件中總的記錄的個(gè)數(shù)
是在第一個(gè)字位置,當(dāng)然不可以放到文件尾,在讀如程序部分,首先讀出該整形
數(shù)
在void loaddate() 中
fread(&k,sizeof(int),1,fp); //讀取之前成功寫入的次數(shù)k。
如果將 k write 到 文件尾 ,失去了意義,并且讀出程序也需要修改
讀出程序如果不能在開(kāi)始判斷出記錄的個(gè)數(shù),必須一次次檢測(cè)直到讀出遇到文件尾或是失敗
不記錄k 也可以家解決讀取個(gè)數(shù)在讀取前知道的問(wèn)題
loaddate()中 使用
fseek(fp,0,SEEK_END);
long L=ftell(fp);
k=L/sizeof(cz);
fseek(fp,0,SEEK_SET);
添加回答
舉報(bào)
0/150
提交
取消