#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始終是你成功寫入的次數。 }elseif(i==2)cheak();elseif(i==3)loaddate();elsebreak;}}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);前時程序會出錯了。為什么。
1 回答

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