您好,欢迎访问三七文档
C语言中的文件操作以下是一些常用的文件的操作:操作成功返回值失败返回值fopen(文件名,文件的打开方式)指向文件的指针NULLfclose(文件指针)0EOF(-1)fputc(ch,fp)输出的字符ch-1fgetc(fp)输入的字符feof(fp)10fread(buffer,size,count,fp)Count的值fwrite(buffer,size,count,fp)Count的值fgets(str,n,fp)Str的首地址fputs(str,fp)0EOF注意:fgetc(fp)函数读字符时遇到文件结束符,函数返回一个文件结束标志EOF.上显示出来.EOF不是可输出字符,因此不能在屏幕上显示。由于字符的ASCII不可能出现-1,因此EOF定义为-1是合适的。但当读取二进制问件时,可能读取EOF(-1),但此时不一定文件已经真的结束了。为了确定文件是否真的结束了,可以用feof(fp)函数来测试。问题一:从一个磁盘文件顺序读入字符并在屏幕上显示。Answer:#includestdio.h#includestdlib.hvoidmain(){charch;FILE*fp;if((fp=fopen(1d.txt,r))==NULL)//从文件1.txt中读取数据。{printf(Thefilecannotberead!);exit(0);}ch=fgetc(fp);while(ch!='#'){putchar(ch);ch=fgetc(fp);}fclose(fp);}问题二:从键盘输入一些字符,逐个把它们送到磁盘上去,知道输入一个#为止。Answer:#includestdio.hvoidmain(){charch;FILE*fp;if((fp=fopen(2.txt,w))==NULL)//将屏幕中输入的字符输入到2.txt。printf(Thefilecannotopen!);ch=fgetc(stdin);while(ch!='#'){fputc(ch,fp);ch=fgetc(stdin);}fclose(fp);}问题三:将一个磁盘文件中的数据复制到另一个磁盘文件中。#includestdio.h#includestdlib.hvoidmain(){charch;FILE*fp1;FILE*fp2;if((fp1=fopen(1.txt,r))==NULL)//将文件1.txt中的内容复制到2.txt中。{printf(Thefile1.txtcannotopen!);exit(0);}if((fp2=fopen(2.txt,w))==NULL){printf(Thefile2.txtcannotopen!);exit(0);}ch=fgetc(fp1);while(!feof(fp1)){fputc(ch,fp2);ch=fgetc(fp1);}fclose(fp1);fclose(fp2);}若从命令行DOS中运行可将程序修改如下:#includestdio.h#includestdlib.hvoidmain(intargc,char*args[]){charch;FILE*fp1;FILE*fp2;if(argc!=3){printf(Theparametersarewrong!);exit(0);}if((fp1=fopen(args[1],r))==NULL){printf(Thefile1.txtcannotopen!);exit(0);}if((fp2=fopen(args[2],w))==NULL){printf(Thefile2.txtcannotopen!);exit(0);}ch=fgetc(fp1);while(!feof(fp1)){fputc(ch,fp2);ch=fgetc(fp1);}fclose(fp1);fclose(fp2);}加入源文件为main.cpp,经编译以后会找到一个main.exe的文件,在命令行中切换到exe文件所在的目录,并打入main1.txt2.txt即可。可用type1.txt和type2.txt检验是否执行。问题一:从键盘输入4个学生的有关数据,然后把他们转存到磁盘文件中去。Answer:#includestdio.h#includestdlib.hstructstudent_type{charname[10];intnum;intage;charaddr[30];}stud[4];voidsave(){FILE*fp;if((fp=fopen(1.txt,wb))==NULL){printf(Thefilecannotbewritten!);exit(0);}for(inti=0;i4;i++)fwrite(&stud[i],sizeof(structstudent_type),1,fp);fclose(fp);}voidmain(){for(intj=0;j4;j++)scanf(%s%d%d%s,stud[j].name,&stud[j].num,&stud[j].age,stud[j].addr);save();}问题二:将文件1.txt中的数据输出到屏幕上。Answer:#includestdio.h#includestdlib.hstructstudent_type{charname[10];intnum;intage;charaddr[30];}stud[4];voidprint(){FILE*fp;if((fp=fopen(1.txt,rb))==NULL){printf(Thefilecannotberead!);exit(0);}for(inti=0;i4;i++){fread(&stud[i],sizeof(structstudent_type),1,fp);printf(%5s%5d%5d%5s\n,stud[i].name,stud[i].num,stud[i].age,stud[i].addr);}fclose(fp);}voidmain(){print();}注意:fread和fwrite一般使用于二进制文件的输入和输出。因为它们是按照数据块的长度来处理输入输出的。如果写:fread(&stud[i],sizeof(structstudent_type),1,stdin);企图从终端键盘输入数据,这在语法上并不存在错误,编译能通过,但由于fread函数要求一次输入29个字节(而不问这些字节的内容),因此输入数据中的空格也作为输入数据而不作为数据间的分隔符了。1.五名学生,期末考试每人有四门课:数学,物理,英语和语文。从键盘上输入每位学生的数据,计算出平均分,将原有文件和计算出的平均分放在文件score.txt中。Answer:#includestdio.h#includestdlib.h#defineN5structstudent{intnum;charname[10];intscore[4];floataverage;}stud[N];voidsave(){FILE*fp;if((fp=fopen(score.txt,wb))==NULL){printf(Thefilecannotbewritten!);exit(0);}if((fwrite(stud,sizeof(structstudent),N,fp))!=N){printf(Errorwritingtothefile!\n);exit(0);}}voidprint(){for(intg=0;g5;g++)printf(学生%d的学号为%d,姓名为%s,平均分为%f\n,g,stud[g].num,stud[g].name,stud[g].average);}voidmain(){for(inti=0;iN;i++){scanf(%d%s,&stud[i].num,stud[i].name);for(intj=0;j4;j++)scanf(%d,&stud[i].score[j]);floattemp=0;for(inth=0;h4;h++){temp+=stud[i].score[h];}stud[i].average=temp/4;}save();print();}2.将上题修改一下,使其数据按平均分排序,将已排序好的数据存入一个新的文件sort.txt中。Answer:#includestdio.h#includestdlib.h#defineN5structstudent{intnum;charname[10];intscore[4];floataverage;}stud[N];voidsave(){FILE*fp;if((fp=fopen(score.txt,wb))==NULL){printf(Thefilecannotbewritten!);exit(0);}if((fwrite(stud,sizeof(structstudent),N,fp))!=N){printf(Errorwritingtothefile!\n);exit(0);}fclose(fp);}voidsortSave(){FILE*fp;if((fp=fopen(sort.txt,wb))==NULL){printf(Thefilecannotbewritten!);exit(0);}if((fwrite(stud,sizeof(structstudent),N,fp))!=N){printf(Errorwritingtothefile!\n);exit(0);}fclose(fp);}voidsort(){structstudenttemp;for(intk=1;kN;k++){for(intm=0;mN-k;m++){if(stud[m].averagestud[m+1].average){temp=stud[m];stud[m]=stud[m+1];stud[m+1]=temp;}}}}voidprint(){for(intg=1;g=N;g++)printf(学生%d的学号为%d,姓名为%s,平均分为%f\n,g,stud[g-1].num,stud[g-1].name,stud[g-1].average);}voidmain(){for(inti=0;iN;i++){scanf(%d%s,&stud[i].num,stud[i].name);for(intj=0;j4;j++)scanf(%d,&stud[i].score[j]);floattemp=0;for(inth=0;h4;h++)temp+=stud[i].score[h];stud[i].average=temp/4;}save();printf(排列前的数据:\n);print();printf(排列后的数据:\n);sort();sortSave();print();}3.设ptr指向字符串“Cprogram”,写出下面函数的输出结果?Printf(“|%5s|”,ptr);Printf(“|%-5s|”,ptr);Printf(“|%10s|”,ptr);printf(“|%10.5s|”,ptr);Answer:运行结果如下:|Cprogram||Cprogram||Cprogram||Cpro|1.编写一个程序,把一个文件的内容复制到另一个文件上,在复制时把大写字母改为小写字母。Answer:#includestdio.h#includestdlib.hvoidmain(){FILE*fp1,*fp2;if((fp1=fopen(origin.txt,r))==NULL){printf(Filereaderror!);exit(0);}if((fp2=fopen(copy.txt,w))==NULL){printf(Filereaderror!);exit(0);}charch;w
本文标题:C语言中的文件操作
链接地址:https://www.777doc.com/doc-4804101 .html