![《C语言程序设计》第10章 文件写字字帖_第1页](http://file4.renrendoc.com/view/c24b8d25b36276de47043d439732a1ea/c24b8d25b36276de47043d439732a1ea1.gif)
![《C语言程序设计》第10章 文件写字字帖_第2页](http://file4.renrendoc.com/view/c24b8d25b36276de47043d439732a1ea/c24b8d25b36276de47043d439732a1ea2.gif)
![《C语言程序设计》第10章 文件写字字帖_第3页](http://file4.renrendoc.com/view/c24b8d25b36276de47043d439732a1ea/c24b8d25b36276de47043d439732a1ea3.gif)
![《C语言程序设计》第10章 文件写字字帖_第4页](http://file4.renrendoc.com/view/c24b8d25b36276de47043d439732a1ea/c24b8d25b36276de47043d439732a1ea4.gif)
![《C语言程序设计》第10章 文件写字字帖_第5页](http://file4.renrendoc.com/view/c24b8d25b36276de47043d439732a1ea/c24b8d25b36276de47043d439732a1ea5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章文件10.1文件指针10.2指针变量10.1文件指针10.1.1文件类型指针
10.1.2文本文件和二进制文件10.1.3文件的打开与关闭10.1.1文件类型指针在程序想要使用文件的时候,首先必须要能够找到这个文件,这就需要文件类型的指针变量。可以定义一个文件类型的指针变量,然后使这个指针变量指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息访问该文件。也就是说,通过文件指针变量能够找到与它相关的文件。例如:FILE*fp;在这里,fp是一个指向FILE类型结构体变量的指针变量,当文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件;文件关闭后,它的文件结构体被释放。如果有n个文件,一般应定义n个指向FILE类型结构体的指针变量,将它们分别指向n个文件,即指向存放该文件信息的结构体变量,以实现对文件的访问。例10.1以下程序打开新文件f.txt,并调用字符输出函数将a数组中的字符写入其中。#include<stdio.h>main(){
*fp; chara[5]={'1','2','3','4','5'},i;
fp=fopen("f.txt","w");
for(i=0;i<5;i++)fputc(a[i],fp);
fclose(fp);}分析:此题下划线处为填空位置,在这里应该首先定义一个文件类型则指针变量fp,所以答案是FILE。C程序通过操作系统访问磁盘上的文件如图10.3所示。10.310.1.1文件类型指针返回10.1.2文本文件和二进制文件C语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。根据数据的组织形式,可分为ASCII文件和二进制文件。ASCII文件又称为文本文件,它的每一个字节存放一个ASCII代码,代表一个字符;而二进制文件则是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。例如整数12345,假设其为int类型,则其在内存中表示为“0011000000111001”,只占两个字节,共十六位,那么12345的二进制文件也为“0011000000111001”。而当把这个数字输出到终端屏幕或者打印时,系统会自动将其翻译成“12345”五个字符,便于人们读它,表示为“0011000100110010001100110011010000110101”,其中每个字符占一个字节,五个字节共40位,这种数据组成的文件称为文本文件。如图10.4所示。图10.412345的二进制文件表示和文本文件表示10.1.2文本文件和二进制文件任何文本文件都可以在终端上显示,而二进制文件却不能,当然也不能打印,二进制文件只能由计算机去读。用ASCII文件输出时,其与字符是一一对应的,一个字节代表一个字符,因而便于对字符进行逐个处理,便于输出字符,但一般占存储空间较多,并且因为要进行二进制形式和ASCII码之间的转换,需要花费转换的时间;而二进制文件所有字节存储的都是二进制数,以二进制文件形式输出数据,可以节省外存空间和转换时间。由前所知,一个C语言文件是一个字节流或者二进制流,它把数据看作是一连串的字符(字节),在C语言中对文件的存取是以字符(字节)为单位的,输入输出的数据流的开始和结束仅受程序控制,我们把这种文件又称为流式文件。C语言允许对文件存取一个字符,这就增加了处理的灵活性。10.1.2文本文件和二进制文件例10.2下列关于C语言文件的叙述中正确的是
A)文件由一系列数据依次排列组成,只能构成二进制文件
B)文件由结构序列组成,可以构成二进制文件或文本文件
C)文件由数据序列组成,可以构成二进制文件或文本文件
D)文件由字符序列组成,其类型只能是文本文件分析:参照本节对文件定义,根据数据的组织形式,文件可分为ASCII文件和二进制文件,所以正确答案是C。返回10.1.3文件的打开与关闭文件使用的方式是首先打开文件,然后进行文件的读/写操作,文件使用完毕以后要关闭文件。文件的打开使用标准输入输出函数库中的fopen()函数。fopen()函数功能是按指定方式打开文件。如果文件正常打开,其返回值为指向文件结构体的指针;如果文件打开失败,其返回值为NULL。fopen()函数的原型如下:格式:FILE*fopen(char*name,char*mode)其中*name为要打开的文件名,*mode为使用文件的方式(见表10-1)。fopen函数的调用方式通常为:FILE*fp;fp=fopen(“test.c”,“w”);这段代码表示打开文件名为“test”的文件,使用文件方式为“只写”(w代表write,即只写),fopen函数带回指向test文件的指针并赋给fp,这样fp就和test相联系了,或者说,fp就指向了test文件。判断文件是否打开,要看fopen函数返回给fp的值是否为NULL,如果为NULL,则说明文件没有打开。10.1.3文件的打开与关闭例10.3以下程序用来判断指定文件是否能正常打开#include<stdio.h>main(){ FILE*fp; if(((fp=fopen("test.txt","r"))==_____)) printf("未能打开文件!\n"); else printf("文件打开成功!\n");}分析:本题判断文件是否打开,判断文件是否打开,要看fopen函数返回给fp的值是否为NULL,如果为NULL,则说明文件没有打开。所以正确答案为NULL。通过前边所述可以看出,打开一个文件涉及到3个信息:①需要打开的文件名,也就是准备访问的文件的名字;②使用文件的方式(如本例使用文件的方式为“w”);③让哪一个指针变量指向被打开的文件。10.1.3文件的打开与关闭例10.4设fp已定义,执行语句fp=fopen(“file”,“w”);后,以下针对文本文件file操作叙述的选项中正确的是A)写操作结束后可以从头开始读B)只能写不能读C)可以在原有内容后追加写D)可以随意读和写分析:参照表10-1可知,正确答案为B。在使用完一个文件后,应当将其关闭,以防它再被误用。所谓关闭文件,就是使文件的指针变量不再指向该文件,此后不能再通过该指针对原来与其相联系的文件进行读写操作,除非再次打开。文件的关闭使用标准输入输出函数库中的fclose()函数。fclose()函数的原型如下所示。格式:intfclose(FILE*fp)例如:fclose(fp);前面我们曾把用fopen函数打开文件所带回的指针赋值给了fp,现在通过fclose函数将fp不再指向该文件,即将文件关闭了。fclose函数带回一个整形数据的返回值,如果顺利地关闭了文件,则返回值为0;否则返回EOF(-1)。EOF(ENDOFFILE)是在stdio.h文件中定义的符号常量,值为-1。10.2指针变量10.2.1调用fgetc和fputc函数进行输入和输出10.2.2fscanf和fprintf函数的应用10.2.3fgets和fputs函数的应用10.2.4fread和fwrite函数的应用10.2.5文件定位函数(rewind和fseek函数的应用)10.2.6判断文件结束函数feof10.2.1调用fgetc和fputc函数进行输入和输出fgetc函数是从指定的文件读入一个字符,该文件必须是以读或读写方式打开的。fgetc函数的调用形式如下所示。格式:ch=fgetc(fp);fp为指向文件的文件型指针变量,ch为字符变量。fgetc函数带回一个字符,赋值给ch。如果在执行fgetc函数读字符时遇到文件结束符,函数返回一个文件结束标志EOF(-1)。在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc函数后,该位置指针将向后移动一个字节。因此可连续多次使用fgetc函数,读取多个字符。应注意文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。10.2.1调用fgetc和fputc函数进行输入和输出例10.5读入文件abc.c,在屏幕上输出。#include<stdio.h>main(){ FILE*fp; charch; if((fp=fopen("abc.c","rt"))==NULL) { printf("文件打开失败!"); getch(); exit(1); } ch=fgetc(fp); while(ch!=EOF) { putchar(ch); ch=fgetc(fp); } fclose(fp);}分析:本例程序的功能是从文件中逐个读取字符,在屏幕上显示。程序定义了文件指针fp,以读文本文件方式打开文件“abc.c”,并使fp指向该文件。如打开文件出错,给出提示并退出程序。程序第12行先读出一个字符,然后进入循环,只要读出的字符不是文件结束标志EOF,就把该字符显示在屏幕上,再读入下一字符。每读一次,文件内部的位置指针向后移动一个字符,文件结束时,该指针指向EOF。当执行本程序时将显示整个文件。10.2.1调用fgetc和fputc函数进行输入和输出fputc函数是把一个字符写到磁盘文件上去。其一般调用形式如下所示。格式:fputc(ch,fp);其中ch是要输出的字符,它可以是一个字符常量,也可以是一个字符变量。fp是文件指针变量。fputc(ch,fp)函数的作用是将字符(ch的值)输出到fp所指向的文件中去。被写入的文件可以用、写、读写,追加方式打开,用写或读写方式打开一个已存在的文件时将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件内容,希望写入的字符以文件末开始存放,必须以追加方式打开文件。被写入的文件若不存在,则创建该文件。每写入一个字符,文件内部位置指针向后移动一个字节。fputc函数有一个返回值,如写入成功则返回写入的字符,否则返回一个EOF。可用此来判断写入是否成功10.2.1调用fgetc和fputc函数进行输入和输出例10.6从键盘输入一行字符,写入一个文件,再把该文件内容读出显示在屏幕上#include<stdio.h>main(){ FILE*fp; charch; if((fp=fopen("abc","wt+"))==NULL) { printf("文件打开失败!"); getch(); exit(1); } printf("inputastring:\n"); ch=getchar(); while(ch!='\n') { fputc(ch,fp); ch=getchar(); } rewind(fp); ch=fgetc(fp); while(ch!=EOF) { putchar(ch); ch=fgetc(fp); } printf("\n"); fclose(fp);}分析:程序中第6行以读写文本文件方式打开文件abc。程序第13行从键盘读入一个字符后进入循环,当读入字符不为回车符时,则把该字符写入文件之中,然后继续从键盘读入下一字符。每输入一个字符,文件内部位置指针向后移动一个字节。写入完毕,该指针已指向文件末。如要把文件从头读出,须把指针移向文件头,程序第19行rewind函数的作用是把fp所指文件的内部位置指针移到文件头返回10.2.2fscanf和fprintf函数的应用fscanf函数、fprintf函数的功能与scanf函数和printf函数类似,都是格式化读写函数。只不过fscanf函数和fprintf函数的读写对象不是终端,而是磁盘文件。(1)fprintf函数的一般调用方式如下所示。格式:intfprintf(FILE*fp,constchar*format[,argument,…])功能是根据格式字符串frmat把argument列表中的表达式值写到fp所指向的文件中。注意格式说明符的个数必须与参数的个数相同。如果调用成功,则返回输出字节数,如果是调用失败或者已到了文件尾端,则返回EOF。10.2.2fscanf和fprintf函数的应用例10.7有以下程序#include<stdio.h>main(){FILE*f;f=fopen("filea.txt","w");fprintf(f,"abc");fclose(f);}若文本文件filea.txt中原有内容为:hello,则运行以上程序后,文件filea.txt的内容为A)helloabcB)abcloC)abcD)abchello分析:程序中首先以只写的方式打开了filea.txt文件,然后通过fprintf函数将字符串“abc”写入文件filea.txt,由表10-1可知,文件filea.txt中的内容将被重写,所以虽然文件中原有内容为hello,但写入的abc覆盖掉了原有内容,所以答案应该是C。10.2.2fscanf和fprintf函数的应用fscanf函数的一般调用方式如下所示。格式:intfscanf(FILE*fp,constchar*format[,address,…])功能是根据format中的格式从fp指向的文件中读取数据存入到相应的address指向的变量中。注意格式说明符和地址的个数必须与输入字段的个数相同。如果调用成功,fscanf函数返回成功扫描、转换和存储的输入字段的个数,返回值不包括没有被存储的字段。当没有字段被保存时,将返回0,如果遇到文件终止符,则返回EOF。10.2.2fscanf和fprintf函数的应用例10.8有以下程序#include<stdio.h>main(){ FILE*fp; intk,n,i,a[6]={1,2,3,4,5,6}; fp=fopen("d2.dat","w"); for(i=0;i<6;i++) fprintf(fp,"%d\n",a[i]); fclose(fp); fp=fopen("d2.dat","r"); for(i=0;i<3;i++) fscanf(fp,"%d%d",&k,&n); fclose(fp); printf("%d,%d\n",k,n);}程序运行后的输出结果是A.1,2 B.3,4C.5,6 D.123,456分析:在此程序中,首先定义了一个数组a,其中初始化有1,2,3,4,5,6等6个数组元素。然后以只写的方式打开了文件d2.dat,通过循环语句将数组a中的内容写入文件a2.dat,关闭文件d2.dat,此时文件中的内容为1,2,3,4,5,6。再通过只读的方式打开文件a2.dat,利用循环语句,将文件中的内容读入到变量k和n中,第一次循环是将文件中1读入到k,2读入到n,此时文件的位置指针指向了文件中的3;第二次循环是将文件中3读入到k,4读入到n,此时文件的位置指针指向了文件中的5;第三次循环是将文件中5读入到k,6读入到n,此时循环结束,关闭了文件。所以此时输出k和n的值为“5,6”,正确答案为C。返回10.2.3fgets和fputs函数的应用fgets函数和fputs函数类似于以前介绍过的gets函数和puts函数,其作用都是读写字符串。只不过fgets函数和fputs函数是以指定的文件作为读写对象。(1)读字符串函数fgetsfgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式如下所示。格式:char*fgets(char*s,intn,FILE*fp);例如:fgets(str,n,fp);n为要求得到的字符个数,但只从fp指向的文件输入n-1个字符,然后在最后加一个’\0’字符,因此得到的字符串共有n个字符,把它们放到字符数组str中。如果在读完n-1个字符之前遇到换行符或者EOF,读入即结束。fgets正常时返回读取字符串的首地址;出错或到了文件尾端,则返回NULL。10.2.3fgets和fputs函数的应用例10.9从string文件中读入一个含10个字符的字符串#include<stdio.h>main(){FILE*fp;charstr[11];if((fp=fopen("d:\\jrzh\\example\\string","rt"))==NULL){printf("文件打开失败!");getch();exit(1);}fgets(str,11,fp);printf("%s",str);fclose(fp);}分析:本例定义了一个字符数组str共11个字节,在以读文本文件方式打开文件string后,从中读出10个字符送入str数组,在数组最后一个单元内将加上'\0',然后在屏幕上显示输出str数组。输出的十个字符正是例13.1程序的前十个字符10.2.3fgets和fputs函数的应用写字符串函数fputsfputs函数的功能是向指定的文件写入一个字符串,其调用形式如下所示。格式:intfputs(char*s,FILE*fp)
其中字符串可以是字符串常量,也可以是字符数组名或指针变量,字符串末尾’\0’不输出,若fputs正常时则返回写入的最后一个字符;如果出错,则返回EOF。例如:fputs("abcd",fp);其意义是把字符串“abcd”写入fp所指的文件之中。10.2.3fgets和fputs函数的应用例10.10在例10.5中建立的文件string中追加一个字符串。#include<stdio.h>main(){ FILE*fp; charch,st[20]; if((fp=fopen("string","at+"))==NULL) { printf("Cannotopenfilestrikeanykeyexit!"); getch(); exit(1); } printf("inputastring:"); scanf("%s",st); fputs(st,fp); rewind(fp); ch=fgetc(fp); while(ch!=EOF) { putchar(ch); ch=fgetc(fp); } printf(""); fclose(fp);}分析:本例要求在string文件末加写字符串,因此,在程序第6行以追加读写文本文件的方式打开文件string。然后输入字符串,并用fputs函数把该串写入文件string。在程序15行用rewind函数把文件内部位置指针移到文件首。再进入循环逐个显示当前文件中的全部内容。返回10.2.4fread和fwrite函数的应用用fgetc函数和fputc函数可以用来读写文件中的一个字符,但通常要求一次读入一组数据,fread函数和fwrite函数就可以用来读写一个数据块。它们的一般调用形式如下所示。格式:size_tfread(void*buffer,size_tsize,size_tcount,FILE*fp)size_tfwrite(void*buffer,size_tsize,size_tcount,FILE*fp)其中:buffer:指向要输入/输出数据块的首地址的指针;size:每个要读/写的数据块的大小(字节数);count:要读/写的数据块的个数;fp:要读/写的文件指针。如果fread函数或fwrite函数调用成功,则函数返回值为count的值,即输入或输出数据项的完整个数;如果出错或到文件尾端,则返回0
10.2.4fread和fwrite函数的应用例如:fread(f,4,2,fp);其中f是一个实型数组名。一个实型变量占4个字节。这个函数从fp所指向的文件读入2个4个字节的数据,存储到数组f中。如果有以下的一个结构体类型:structstudent{intnum;charname[20];charsex;intage;chartelephone[3];}stud[10];结构体数组stud有10个数组元素,每一个元素用来存放一个学生的数据(包括学号,姓名,性别,年龄,电话)。假设学生的数据已存放在磁盘文件中,可以用下面的for语句和fread函数读入10个学生的数据:for(i=0;i<10;i++)fread(&stud[i],sizeof(structstudent),1,fp);10.2.4fread和fwrite函数的应用例10.11以下程序运行后的输出结果是_____#include<stdio.h>main(){ FILE*fp; intx[6]={1,2,3,4,5,6},i; fp=fopen("test.dat","wb"); fwrite(x,sizeof(int),3,fp); rewind(fp); fread(x,sizeof(int),3,fp); for(i=0;i<6;i++) printf("%d",x[i]); printf("\n"); fclose(fp);}分析:在程序中首先定义了一个数组x,然后以只写的方式打开一个二进制文件test.dat,将x数组中的数据写入6个字节(每个int型数据为2个字节,3说明是6个字节)到文件中,然后把文件内部位置指针移到文件初始位置,在文件中读出相同大小的数据,最后使用循环语句,将x中数据输出到屏幕。所以本题的正确答案为123456。返回10.2.5文件定位函数(rewind和fseek函数的应用)在文件内部,存在一个位置指针,这个指针指向文件当前读写的位置。一般情况下,指向文件的指针指向文件的起始部分,而文件的位置指针则指向当前读写的位置。如果顺序读写一个文件,每次读写完一个字符后,位置指针自动指向下一个字符。如果想要将位置指针指向其它指定的字符,即使位置指针指向其他指定的位置,则可以使用文件的定位函数强制位置指针指向指定内容。(1)rewind函数的作用是使位置指针重新返回到文件的起始位置,清除文件结束标志和出错标志,rewind函数没有返回值。格式:voidrewind(FILE*fp)10.2.5文件定位函数(rewind和fseek函数的应用)例10.12#include<stdio.h>main(){ FILE*fp; charstr[10]; fp=fopen("myfile.dat","w"); fputs("abc",fp); fclose(fp); fp=fopen("myfile.dat","a+"); fprintf(fp,"%d",28); rewind(fp); fscanf(fp,"%s",str); puts(str); fclose(fp);}程序运行后的输出结果是A)abc
B)28c
C)abc28
D)因类型不一致而出错。分析:程序中首先定了一个字符数组str,然后以只写的方式打开了文件myfile.dat,向文件中输入字符串“abc”,然后关闭文件,再以追加的方式打开文件myfile.dat,向文件中输入28,此时文件中myfile.dat的内容为abc28,然后执行rewind函数,使文件的位置指针重新定位于文件的起始位置,将文件中的内容写入
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全新区间2025年度信息技术服务合同下载
- 郑州工业应用技术学院《立体裁剪应用》2023-2024学年第二学期期末试卷
- 湖州学院《金融工程综合》2023-2024学年第二学期期末试卷
- 湖南工业职业技术学院《雷达与通信导航》2023-2024学年第二学期期末试卷
- 成都工贸职业技术学院《国际商务谈判模拟实训》2023-2024学年第二学期期末试卷
- 烟台幼儿师范高等专科学校《字体设计与应用课程设计》2023-2024学年第二学期期末试卷
- 2024-2025学年安徽省宿州市砀山县八校高一上学期期中联考语文试卷
- 成都医学院《藏文诗歌欣赏》2023-2024学年第二学期期末试卷
- 湛江科技学院《书法鉴赏》2023-2024学年第二学期期末试卷
- 东北农业大学《土地利用评价与规划A》2023-2024学年第二学期期末试卷
- 部编版小学五年级语文教材培训课件【部编】
- 盆景造型经验
- 能力不足方面存在的问题及整改措施【9篇】
- 悟真篇-薛道光注
- 金融科技学-完整全套课件
- 重大危险源公示牌(完整)-2
- 物理学史中国古代物理学
- 初一英语英语阅读理解专项训练15篇
- 【工程造价管理国内外文献综述1500字】
- 高中地理学情分析方案和报告
- (完整)小学语文考试专用作文方格纸
评论
0/150
提交评论