C语言程序设计第3版何钦铭 颜 晖 第12章 文件范本模板Word格式文档下载.docx
《C语言程序设计第3版何钦铭 颜 晖 第12章 文件范本模板Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C语言程序设计第3版何钦铭 颜 晖 第12章 文件范本模板Word格式文档下载.docx(26页珍藏版)》请在冰豆网上搜索。
%d,num:
%d,name:
%s\n”,students[j].score,students[j].num,&
students[j].stname);
printf(”Minscore:
%d,num:
%d,name:
%s\n”,students[k].score,students[k]。
num,&students[k]。
stname);
if(fclose(fp)){
printf("
Cannotclosethefile!
\n”);
return0;
}
【练习12—2】请使用例8—9答电码加密函数对民吗字符串进行加密,改写例12-2。
#include〈stdio.h>
#include<
string.h〉
#include〈stdlib。
h>
structsysuser{
charusername[20];
charpassword[8];
};
voidencrypt(char*pwd);
{
FILE*fp;
inti;
structsysusersu;
if((fp=fopen(”f12-2.txt"
,"
w"
))==NULL){
Fileopenerror!
\n"
);
for(i=1;
i<
=5;
i++){
Enter%dthsysuser(namepassword):
”,i);
scanf(”%s%s”,su.username,su。
password);
encrypt(su.password);
fprintf(fp,"
%s%s\n"
su.username,su。
}
if(fclose(fp)){
Cannotclosethefile!
}
voidencrypt(char*pwd)
for(i=0;
strlen(pwd);
i++)
if(pwd[i]==’z’)
pwd[i]=’a’;
else
pwd[i]+=1;
【练习12-3】例12—3中为什么在执行fputc(ch,fp2)前要判断ch的值是否等于EOF?
改写例12—3的程序,在复制用户信息文件后,再统计被复制文件中字符的数量。
文件结束符EOF是一个值为-1的常量,读文件时可用来判断从文件中读入的字符是否为EOF来决定循环是否继续。
FILE*fp1,*fp2;
charch;
intcount=0;
if((fp1=fopen("
f12—2。
txt”,"
r"
))=NULL){
if((fp2=fopen("
f12-3.txt”,”w”))==NULL){
);
exit(0);
}
while(!
feof(fp1)){
ch=fgetc(fp1);
if(ch!
=EOF){
fputc(ch,fp2);
count++;
}
if(fclose(fp1)){
}
if(fclose(fp2)){
printf(”f12—2中字符数量为:
%d”,count);
}
【练习12—4】字母转换并统计行数:
读取一个指定的文本文件,显示在屏幕上,如果有大写字母,则改成小写字母再输出,并根据回车符统计行数.试编写相应程序。
#include〈stdio。
#include〈stdlib.h〉
charch;
intcountline=0;
练习12—4。
txt"
r”))==NULL){
printf("
Notopen!
”);
exit(0);
feof(fp)){
ch=fgetc(fp);
if(ch!
=EOF)
if(ch>
=’A'
&&ch<
=’Z'
)
%c”,ch—’A'
+’a'
else
%c”,ch);
if(ch==’\n'
countline++;
file’slineis:
%d.”,countline+1);
Cannotclose!
”);
exit(0);
return0;
【练习12—5】写字符并验证:
从键盘输入一行字符,写入到文件f3。
txt中,并重新读出,最终在屏幕上显示验证。
程序输入以读到回车符“\n”为结束,读文件时要用EOF来控制循环。
试编写相应程序。
解答:
#include〈stdio。
stdlib。
intmain(void)
{
FILE*fp;
if((fp=fopen(”f3.txt”,"
w+"
))==NULL){
cannotopenfile!
"
printf(”Inputthestring:
ch=getchar();
while(ch!
='
\n'
){
fputc(ch,fp);
rewind(fp);
while(!
feof(fp)){
ch=fgetc(fp);
=EOF)
putchar(ch);
printf(”cannotclosefile!
【练习12—6】实数取整写入文件:
文件f1.txt中有若干个实数,请分别读出,将每个实数按四舍五入取整后存入文件f2.txt中。
FILE*fp1,*fp2;
doublea;
if((fp1=fopen(”f1。
txt”,”r"
printf(”Fileopenerror!
if((fp2=fopen(”f2.txt"
,”w"
feof(fp1)){
fscanf(fp1,”%lf”,&a);
fprintf(fp2,”%。
0f"
,a);
if(fclose(fp1)){
printf(”Cannotclosethefile!
if(fclose(fp2)){
printf(”Cannotclosethefile!
【练习12—7】修改例12-6,增加修改资金账户的功能。
输入一个记录ID,如果文件中已存在该记录,则输入新的记录信息并更新资金账户文件中相应记录的信息。
要求定义和调用函数UpdateLog(),其功能是修改资金账户记录.
longsize;
structLogData{
longlogid;
charlogdate[11];
char1ognote[15];
doublecharge;
doublebalance;
intinputchoice()
intmychoice;
\nEnteryourchoice:
\n”);
1—AddanewcashLOG。
\n2—ListAllCashLOG.\n"
printf(”3-QueryLastCashLoG.\n0-Endprogram。
scanf(”%d”,&mychoice);
returnmychoice;
longgetLogcount(FILE*cfptr)
longbegin,end,logcount;
fseek(cfptr,OL,SEEK_SET);
begin=ftell(cfptr);
fseek(cfptr,size,SEEK_END);
end=ftell(cfptr);
logcount=(end-begin)/size—1;
returnlogcount;
/*列出所有收支流水账*/
voidListAllLog(FILE*cfptr)
structLogDatalog;
fseek(cfptr,OL,SEEK_SET);
fread(&log,size,1,cfptr);
printf(”logidlogdatelognotechargebalance\n"
feof(cfptr)){
printf(”%6ld%—11s%-15%10。
2lf%10.2lf\n”,log。
logid,log.logdate,log.lognote,log。
charge,log。
balance);
fread(&
log,size,1,cfptr);
};
/*查询显示最后一条记录*/
voidQueryLastLog(FILE*cfptr)
longlogcount;
logcount=getlogcount(cfptr);
if(1ogcount>
0)
{
fseek(cfptr,size*(logcount-1),SEEK_SET);
log,size,1,cfptr);
printf(”Thelastlogis:
logid:
%—6ld\nlogdate:
%-11s\nlognote:
%-15s\n"
log。
logid,log.logdate,log。
lognote);
printf(”charge:
%-10.2lf\nbalance:
—10。
2lf\n"
log.charge,1og.balance);
elseprintf(”nologsinfile!
/*添加新记录*/
voidAddNewLog(FILE*cfptr)
structLogDatalog,lastlog;
longlogcount;
printf(”Inputlogdate(format:
2006-01—01):
scanf(”%s"
,log.logdate);
Inputlognote:
scanf("
%s"
,log。
printf(”InputCharge:
Income+andepend—:
%lf”,&log.charge);
logcount=getLogcount(cfptr);
if(logcount>
0){
fseek(cfptr,size*(logcount-1),SEEK_SET);
fread(&lastlog,size,1,cfptr)
log。
logid=lastlog.1ogid+1;
balance=log。
charge+lastlog。
balance;
else{
log.logid=1;
charge;
rewind(cfptr);
ogid=last-taraetlastlog;
logid=%ld\n”,log。
logid);
fwirte(&log,sizeof(structLogData),1,cfptr);
/*修改资金账户*/
voidUpdateLog(FILE*cfptr)
FILE*fpout;
structLogDatauser;
chardate[11];
charnote[15];
doublecharge;
intchoice,ID;
cfptr=fileopen("
r”);
if((fpout=fopen(”cash.dat"
w”))==NULL){
cannotopenthefile!
EnterLogID:
%d"
&ID);
feof(cfptr)){
fread(&user,sizeof(structLogData),1,cfptr);
if(strcmp(user。
logid,ID)==0){
printf(”请输入修改信息:
printf(”Date:
%s"
,date);
strcpy(user.logdate,date);
Note:
%s”,note);
strcpy(user。
lognote,note);
printf(”Charge:
user。
charge=charge;
printf(”Balance:
%s”,&balance);
balance=balance;
fwrite(&
user,sizeof(structLogData),1,fpout);
}
fwrite(&user,sizeof(structLogData),1,fpout);
if(fclose(cfptr)){
cannotclosefile!
if(fclose(fpout)){
cannotclosefile!
unlink("
cashbox。
dat”);
//remove(”cashbox.dat"
都是删除文件的函数
rename("
cash.dat。
dat"
”cashbox。
dat”);
/*打开文件*/
FILE*openfile(char*openmode)
,openmode))==NULL){
printf(”cannotopenfilecashbox。
dat!
return(fp);
FILE*fp;
intchoice;
size=sizeof(structLogData);
while((choice=inputchoice())!
=0){
switch(choice){
case1:
fp=openfile(”ab+"
AddNewLog(fp);
break;
/*列出所有的收入支出情况*/
case2:
fp=openfile("
rb”);
ListAllLog(fp);
/*查询最后记录及余额*/
case3:
rb"
QueryLastLog(fp);
break;
case4:
rb”);
UpdateLog(fp);
default:
InputError."
习题12
一、选择题
1。
以下语句将输出____B_____。
printf("
%d%d%d"
,NULL,‘\0’,EOF);
A。
001B。
00—1C.NULLEOFD。
10EOF
2.如果二进制文件a.dat已经存在,现在要写入全新数据,应以____B____方式打开。
A.”w”B.”wb”C.”w+"
D.“wb+”
3.定义”FILE*fp;
”,则文件指针fp指向的是_____D_____。
A.文件在磁盘上的读写位置B文件在级冲区上的读写位置
C。
整个磁盘文件D。
文件类型结构
4.缓冲文件系统的文件缓冲区位于____C______。
磁盘缓冲区中B.磁盘文件中
C.内存数据区中D。
程序文件中
5。
使文件指针重新定位到文件读写的首地址的函数是_____C_____。
ftell()B。
fseek()C.rewind()D.ferror()
二、填空题
1.函数fopen()的返回值是_指向文件缓冲区的首地址的文件结构类型指针_。
2.文件的三大特征是__名称__、__大小__和__类型__。
3。
缓冲文件系统与非缓冲文件系统的不同点在于__系统是否为文件自动分配一块文件缓冲区(内存单元)__。
4。
只能向指定文件写入一个字符的函数是_____fputc()函数______。
5.判断文件指针是否已经到了文件尾部的函数是___feof()函数___。
6.阅读程序,以下程序完成的功能是__文件infile内容复制到文件__.
#include〈stdio.h>
intmain(void)
{charinfile[10],outfile[10];
FILE*fpa,*fpb;
gets(infile);
gets(outfile);
fpa=fopen(infile,"
);
fpb=fopen(outfile,"
w”);
while(!
feof(fpa))
fputc(fgetc(fpa),fpb);
fclose(fpa);
fclose(fpb);
return0;
三、程序设计题
1。
统计文本文件中各类字符个数:
分别统计一个文本文件中字母、数字及其他字符的个数。
#include〈stdio.h>
intletter=0,digiter=0,other=0;
12-3.1.txt"
,”r”))==NULL){
Fileopenerror!
while((ch=fgetc(fp))!
=EOF){
&&ch〈=’Z'
||ch〉='
a'
=’z'
letter++;
elseif(ch>
=’0'
&&ch〈=’9’)
digiter++;
other++;
printf(”letter=%d,digiter=%d,other=%d”,letter,digiter,other);
}
2。
将实数写入文件:
从键盘输人若干实数(以特殊数值—1结束),分别写到一个文本文件中。
试编写相应程序.
intnumber;
if((fp=fopen(”12-3。
2.txt"
”w”))==NULL){
cannotopenfile!
exit(0