P304

练习12-1

文件缓冲区:内存中用于数据存储的数据块,在文件处理过程中,程序需要访问该缓冲区实现数据的存取。

在C程序中,文件类型指针主要的功能是:指向文件的缓冲区,通过移动指针实现对文件的操作。

P306

练习12-2

#include<stdio.h> //练习12-2
#include<stdlib.h>
main()
{int i,offset;char pw[80];FILE *fp;if((fp=fopen("凯撒密码.txt","w"))==NULL){printf("文件打开失败!");exit(0);}printf("输入一个正整数offset:");scanf("%d",&offset);getchar();//接受空格 printf("请输入一个字符串:");gets(pw); for(i=0;pw[i]!='\0';i++)//循环取出 {if(pw[i]>='A'&&pw[i]<='Z'){//经检验,程序没有问题,可能是编译器的问题,字母B和b无法输出。(即输入Z 应输出B,无法正常显示)。 if((pw[i]+offset)<'Z'){//未超过最大的字母 pw[i]+=offset;}else pw[i]=pw[i]-('Z'-offset);//越界,倒着减 }else if(pw[i]>='a'&&pw[i]<='z'){if((pw[i]+offset)<'z'){pw[i]=pw[i]+offset;}else pw[i]=pw[i]-('z'-offset);}else pw[i]=pw[i];}fprintf(fp,"%s",pw);fclose(fp);
}

P311

第一问:判断文件是否结束,EOF是文件结束符。

#include<stdio.h>//练习12-3
#include<stdlib.h>
int main(void)
{FILE *fp1,*fp2;int count=0;char ch,ch1;if((fp1=fopen("f12-2.txt","r"))==NULL){printf("文件f12-2打开失败!");exit(0); }if((fp2=fopen("f12-3.txt","w"))==NULL){printf("文件f12-3打开失败!");exit(0);}while(!feof(fp1)){ch=fgetc(fp1);if(ch!=EOF){fputc(ch,fp2);}}fclose(fp1);fclose(fp2);if((fp2=fopen("f12-3.txt","r"))==NULL){printf("文件f12-3打开失败!");exit(0);}while(!feof(fp2)){ch1=fgetc(fp2);if(ch1!=EOF){if(ch1!=' ')//包括了回车,有5个 count++;}}printf("f12-3中的字符数量为:%d",count);fclose(fp2);return 0;
}

P317

练习12-4到12-6

#include<stdio.h>//练习12-4
#include<stdlib.h>
int main(void)
{FILE *fp;char ch;int count=1;if((fp=fopen("letter.txt","r"))==NULL){printf("文件打开失败!");exit(0);}while(!feof(fp)){ch=fgetc(fp);if(ch!=EOF){if(ch>='A'&&ch<='Z'){ch=ch+32;}if(ch=='\n') count++;}printf("%c",ch);}printf("\n共%d行",count);return 0;
}
#include<stdio.h>//练习12-5
#include<stdlib.h>
int main(void)
{FILE *fp;char ch,ch1;if((fp=fopen("f3.txt","w+"))==NULL){printf("文件打开失败!");exit(0);}printf("请输入一行字符:");while((ch=getchar())!='\n'){fprintf(fp,"%c",ch);}rewind(fp);while(!feof(fp)){ch=fgetc(fp);  //用fscanf会将最后一个字符重复输出两遍     if(ch!=EOF) printf("%c",ch);}fclose(fp);return 0;
}
#include<stdio.h>//练习12-6 实数取整写入文件
#include<stdlib.h>
void splitfloat(double x,int *intpart,double *fracpart)
{*intpart=(int)x;//强制转换为整型 *fracpart=x-*intpart;//直接减去整数部分可得小数部分
}
int main(void)
{FILE *fp1,*fp2;int intpart;//x=345.89,小数部分为0.890015 double z,fracpart,a;//x=123.456,小数部分会输出为0.456001if((fp1=fopen("f1.txt","r"))==NULL){printf("文件f1打开失败!"); exit(0);}if((fp2=fopen("f2.txt","w"))==NULL){printf("文件f2打开失败!"); exit(0);}while(!feof(fp1)){fscanf(fp1,"%lf",&z);//读取 if(z!=EOF){ splitfloat(z,&intpart,&fracpart);//拆分整数和小数部分
//          printf("整数部分:%d\n小数部分:%lf\n",intpart,fracpart);//帮助检验 if(fracpart>=0.5){//小数部分 四舍五入 intpart=intpart+1;
//              printf("整数部分:%d\n小数部分:%lf\n",intpart,fracpart);//帮助检验     }fprintf(fp2,"%d\n",intpart);}}return 0;
}

P321

练习12-7

#include"stdio.h"//练习12-7
#include"stdlib.h"
#include"process.h"
#include"string.h"
long size;
struct LogData{long logid;char logdate[11];char lognote[15];double charge;double balance;
};int inputchoice()
{int mychoice;printf("\nEnter your choice:\n");printf("1-Add a new cash LOG.\n2-List All Cash LOG.\n");printf("3-Query Last Cash LOG.\n4-Update a LOG\n0-End program.\n");scanf("%d",&mychoice);return mychoice;
}long getLogcount(FILE *cfptr)
{long begin,end,logcount;fseek(cfptr,0L,SEEK_SET);begin=ftell(cfptr);fseek(cfptr,size,SEEK_END);end=ftell(cfptr);logcount=(end-begin)/size-1;return logcount;
}void ListAllLog(FILE *cfptr)
{struct LogData log;fseek(cfptr,0L,SEEK_SET);fread(&log,size,1,cfptr);printf("logid\tlogdata \tlognote \tcharge\t\tbalance\n");while(!feof(cfptr)){printf("%ld\t%s\t%s\t%.2lf\t\t%.2lf\n",log.logid,log.logdate,log.lognote,log.charge,log.balance);fread(&log,size,1,cfptr);}
}int QueryLastLog(FILE *cfptr)
{struct LogData log;long logcount;int flag=0;logcount=getLogcount(cfptr);if(logcount>0){fseek(cfptr,size*(logcount-1),SEEK_SET);fread(&log,size,1,cfptr);flag=1;printf("The last log is:\n");printf("logid:%-6ld\nlogdate:%-11s\nlognote:%-15s\n",log.logid,log.logdate,log.lognote);printf("charge:%-10.2lf\nbalance:%-10.2lf\n",log.charge,log.balance);}else printf("no logs is file!\n");return flag;
}void AddNewLog(FILE *cfptr)
{struct LogData log,lastlog;long logcount;printf("Input logdate(format:2006-01-01):");scanf("%s",log.logdate);printf("Input lognote:");scanf("%s",log.lognote);printf("Input Charge:Income+and expend-:");scanf("%lf",&log.charge);logcount=getLogcount(cfptr);if(logcount>0){fseek(cfptr,size*(logcount-1),SEEK_SET);fread(&lastlog,size,1,cfptr);log.logid=lastlog.logid+1;//记录号按顺序是上次的号+1log.balance=log.charge+lastlog.balance ;}else {log.logid=1;log.balance=log.charge;}rewind(cfptr);printf("logid=%ld\n",log.logid);fwrite(&log,sizeof(struct LogData),1,cfptr);
}void UpdateLog(FILE *cfptr)//修改 ,先查询再修改
{FILE *fp;struct LogData log[1000],newlog,*plog=log;long id,logcount,i,index=-1;char ch;printf("请输入一个记录ID:");scanf("%ld",&id);logcount=getLogcount(cfptr);    //获取记录数 rewind(cfptr);fread(plog,size,logcount,cfptr);      for(i=0;i<logcount;i++){if(id==log[i].logid){           //找到printf("logid\tlogdata \tlognote \tcharge\t\tbalance\n");//显示当前记录printf("%ld\t%s\t%s\t%.2lf\t\t%.2lf\n",
log[i].logid,log[i].logdate,log[i].lognote,log[i].charge,log[i].balance);index=i;break;} } rewind(cfptr); //有或者没有都无影响 if(index>=0){//没有找到 printf("Input logdate(format:2020-01-01):");scanf("%s",newlog.logdate); printf("Input lognote:");scanf("%s",newlog.lognote); printf("Input Charge:Income+ and expend-:");scanf("%lf",&newlog.charge);if(strcmp(log[index].lognote,newlog.lognote)!=0)//比较,如果不相同,则修改 strcpy(log[index].lognote,newlog.lognote); if(strcmp(log[index].logdate,newlog.logdate)!=0) strcpy(log[index].logdate,newlog.logdate); if(newlog.charge!=log[index].charge){//如果输入的收支额度改变,重新计算余额    newlog.balance=log[index].balance-log[index].charge+newlog.charge; log[index].charge=newlog.charge;  log[index].balance=newlog.balance;for(i=index+1;i<logcount;i++)//当前记录之后的每条记录余额信息更新log[i].balance=log[i-1].balance+log[i].charge;}rewind(cfptr);fwrite(plog,size,logcount,cfptr);  //更新回文件,此处用只读的方式打开 }else{  printf("Error logid and try another!\n");}
}int main(void)
{FILE *fp;int choice;if((fp=fopen("cashbox.dat","ab+"))==NULL){//以此方式打开,写入的数据会被添加到原有数据的后面。所以更新要重新用rb+的方式打开 printf("can not open file cashbox.dat!\n");exit(0);}size=sizeof(struct LogData);while((choice=inputchoice())!=0){switch(choice){case 1:AddNewLog(fp);break;case 2:ListAllLog(fp);break;case 3:QueryLastLog(fp);break;case 4:fp=fopen("cashbox.dat", "rb+");UpdateLog(fp);break;//增加文件打卡方式为只读,则只更新不添加 default:printf("Input Error.");break;}}fclose(fp);return 0;
}

《C语言程序设计》第4版 何钦铭、颜晖主编 课后习题答案 第12章 课后习题相关推荐

  1. 何钦铭c语言程序设计第八章,c语言程序设计(第3版)何钦铭-颜-晖-第8章--指针

    1.第8章 指针[练习8-1]如果有定义"int m, n = 5, *p = &m;"与m = n等价的语句是 B .A m = *p; B. *p = *&n; ...

  2. 何钦铭c语言程序设计第八章,C语言程序设计(第3版)何钦铭颜晖第8章指针

    <C语言程序设计(第3版)何钦铭颜晖第8章指针>由会员分享,可在线阅读,更多相关<C语言程序设计(第3版)何钦铭颜晖第8章指针(16页珍藏版)>请在人人文库网上搜索. 1.第8 ...

  3. 何钦铭c语言第三版第9章答案,c语言程序设计第3版何钦铭 颜 晖 第9章 结构.pdf...

    第 9 章 结构 [练习9-1]定义一个能够表示复数的结构类型,一个复数包括实数与虚数两个 部分. 解答: struct complex{ float real; float imaginary; } ...

  4. C语言程序设计(第3版) 何钦铭 颜晖 主编

    比较大小:输入3个整数,按从小到大的顺序输出.试编写相应程序 C语言程序设计(第3版) 何钦铭 颜晖 主编 第三章 三.程序设计题 #include<stdio.h> #define N ...

  5. 浙大版《C语言程序设计》第四版(何钦铭颜晖) 第9章 结构 课后习题答案

    浙大版<C语言程序设计>第四版(何钦铭颜晖) 第9章 结构 课后习题答案 你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解,还可 ...

  6. 浙大版《C语言程序设计》第四版(何钦铭颜晖) 第4章 循环结构 课后习题答案

    浙大版<C语言程序设计>第四版(何钦铭颜晖) 第4章 循环结构 课后习题答案 你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解, ...

  7. 【个人回顾】C语言程序设计-第三版-何钦铭主编-4

    写在开头:本文不以分享为目的,只是记录自己课程学习过程中觉得重要的部分知识点或者知识体系,以及可能存在的没有解决的问题,欢迎大家来进行交流和指正,其中ps部分为个人将其他学科与其构建联系的个人理解,因 ...

  8. 【个人回顾】C语言程序设计-第三版-何钦铭主编-3

    写在开头:本文不以分享为目的,只是记录自己课程学习过程中觉得重要的部分知识点或者知识体系,以及可能存在的没有解决的问题,欢迎大家来进行交流和指正,其中ps部分为个人将其他学科与其构建联系的个人理解,因 ...

  9. 浙大版《C语言程序设计》第四版(何钦铭颜晖) 第12章 文件 课后习题答案

    你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解,还可以在线答题. 一.选择题 1.以下语句的输出结果是( ). printf(" ...

  10. 浙大版《C语言程序设计》第四版(何钦铭颜晖) 第3章 分支结构 课后习题答案

    你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解,还可以在线答题. 一.选择题 1.有一函数 y={1(x>0)0(1=0)−1(x& ...

最新文章

  1. 待遇46K起,这几个公众号在招人!
  2. opencv 计时 帧率
  3. mysql5.7学习nosql_如何学习NoSQL?
  4. jQuery formValidator表单验证插件4.1.0 下载 演示 文档 可换肤 代码生成器
  5. Iphone 手机如何导入/导出通讯录
  6. axture动画原型制作_Axure制作原型-基础操作
  7. redis分布式锁java代码_基于redis实现分布式锁
  8. 征稿 | Call for papers on Knowledge Graphs
  9. python for循环例子_Python for循环生成列表的实例
  10. c++rpg黑框游戏_c++实现简单RPG对战游戏的代码.doc
  11. 如何将JavaScript转化成Swift?(二)
  12. Delphi vs VC++
  13. yii2基础之modal弹窗的基本使用
  14. Spark机器学习环境搭建
  15. python爬数据是什么意思-python爬虫爬取的数据可以做什么
  16. python按条件删除行_python – 根据条件删除行组
  17. java8 stream中Comparator.comparing排序
  18. Windows 当前所接的屏幕检测
  19. 华为云物联网平台的微信小程序开发
  20. You need Perl 5 安装openssl时报错,提示需要安装perl 5

热门文章

  1. 封号、扣钱:谁来保证专车司机的利益?
  2. 用PS制作一只梦幻的小鹿插画
  3. 飞桨OCR打标、训练、预测、部署全流程
  4. 短视频处理LanSoEditor-SDK之抠图和动画设计
  5. python 基于Tkinter的姻缘测试器
  6. 平价的蓝牙耳机哪家质量好?学生党公认的五款高品质蓝牙耳机
  7. 南卡和OPPO蓝牙耳机哪个更好?高性价比蓝牙耳机评测
  8. 三个数差的平方公式推导过程_学懂因式分解 你只差这8个完全平方公式推导结论 立马见效...
  9. 莫名奇妙的异常010:Unexpected server response (0) while retrieving PDF
  10. 天猫精灵智能家居对接,及天猫iot官网配置图文讲解(二)