您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C语言程序设计教程-第11章
C语言程序设计教程主编张永胡敏中国水利水电出版社第11章文件3主要内容11.2指针变量11.3指针与数组11.1指针的基本概念11.4指针与函数4学习目标了解文件的概念。了解文件类型指针。掌握文件的打开与关闭、文件的读写以及文件的定位函数。511.1文件概述11.1.1文件文件是指驻留在外部介质(如磁盘等)上的一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。从不同的角度可对文件作不同的分类。(1)按文件所依附的介质可分为卡片文件、纸带文件、磁带文件、磁盘文件等。(2)按文件内容可分为源文件、目标文件、数据文件等。(3)按文件中数据组织形式可分为字符文件和二进制文件。1.普通文件与设备文件普通文件是指驻留在磁盘或其他外部介质上的一个有序数据集,可以是源文件、目标文件、可执行程序;也可以是一组输入的原始数据,或者是一组输出的结果。源文件、目标文件、可执行程序可以称作程序文件;输入输出数据可称作数据文件。设备文件是指与主机相联的各种外部设备,如显示器、打印机、键盘等。广义上讲,外部设备也是一个文件,它们的输入、输出等同于对磁盘文件的读和写。通常把显示器定义为标准输出文件,一般情况下在屏幕上显示有关信息就是向标准输出文件输出。如前面经常使用的printf、putchar函数就是这类输出。键盘通常被指定标准的输入文件,从键盘上输入就意味着从标准输入文件上输入数据,scanf、getchar函数就属于这类输入。62.字符文件与二进制文件字符文件通常又称为ASCII码文件或正文文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如一个数1234有4个字符,如果按字符形式输出到磁盘上,一个字符占据一个字节,就占据6个字节。二进制文件是按二进制的编码方式来存放文件的。例如数1234的存储形式为:0000010011010010,只占两个字节。二进制文件虽然也可以在屏幕上显示,但其内容是无法读懂的。C语言在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。711.1.2文件型指针一个指针变量指向一个文件,这个指针称为文件指针,文件进行的各种操作就是通过文件指针完成的。其一般形式为:FILE*指针变量标识符;注意FILE应为大写,它实际上是头文件中定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。其具体格式如下:typedefstruct{int_fd;/*文件号*/int_cleft;/*缓冲区中的剩余字符*/int_mode;/*文件的操作模式*/char*_next;/*下一个字符的位置*/char*_buff;/*文件缓冲区的位置*/}FILE;定义一个指针f1的形式如下:FILE*f1;表示f1是指向FILE结构的指针变量,通过f1即可找到存放某个文件信息的结构变量,然后按结构变量提供的信息找到该文件,实施对文件的操作。811.2文件的打开与关闭11.2.1文件的打开文件打开函数是fopen,用来打开一个文件,其调用的一般形式为:fopen(文件名,文件使用方式);其中,“文件名”是被打开文件的文件名,是字符串常量或字符串数组。“文件使用方式”是指文件的类型和操作要求。其作用是以指定的文件使用方式,打开相应文件名的文件,并返回一个指针返回值,用这个指针可对文件进行读写等操作。例如:FILE*f1;f1=(filea,r);其意义是在当前目录下打开文件filea,只允许进行“读”操作,并使f1指向该文件。9文件使用方式符号含义r打开一个只读的文本文件w打开或创建一个新的只写的文本文件a打开一个文本文件在尾部追加rb打开一个只读的二进制文件wb打开或创建一个新的只写的二进制文件ab对二进制文件追加r+打开一个可读/写的文本文件w+打开或创建一个新的可读/写的文本文件a+打开一个可读/写的文本文件rb+打开一个可读/写的二进制文件wb+打开或创建一个新的可读/写的二进制文件ab+打开一个可读/写的二进制文件文件使用方式1011.2.2文件的关闭文件一旦使用完毕,应使用关闭文件函数把文件关闭,以避免发生文件的数据丢失等错误。文件关闭函数是fclose,其调用的一般形式是:fclose(文件指针变量);其功能是关闭指针所指的文件,同时自动释放分配给文件的内存缓冲区。假如能正确关闭指定的文件,则返回0值,否则返回非0。例如:fclose(fp);正常完成关闭fp所指文件时,fclose函数返回值为0,如返回非零值则表示有错误发生。可以通过返回值监控文件打开与关闭是否正常进行。1111.3文件的读写11.3.1字符的读写字符的读写是靠字符读写函数实现的。字符读写函数是以字符(1字节数据)为单位的读写函数,每次可从文件读出或向文件写入一个字符。1.字符读取函数fgetcfgetc函数的功能是从指定的文件中读一个字符,函数调用的形式为:fgetc(文件指针fp);该函数的功能是从fp所指的文件的当前位置读取单个字符。假如函数运行正确,则返回单个字符;运行错误,则返回EOF(值为-1)。在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。在文件内部有一个位置指针,用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc函数后,该位置指针将向后移动一个字节。因此可连续多次使用fgetc函数,以连续读取多个字符。12【例11-1】读取文件f1.txt,在屏幕上输出。#includestdio.hmain(){FILE*fp;charch;if((fp=fopen(f1.txt,r))==NULL){printf(Cannotopenfile!);exit(0);}ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp);}fclose(fp);}132.字符写入函数fputcfputc函数的功能是把一个字符写入指定的文件中,函数的调用形式是:fputc(字符量ch,文件指针fp);其中的字符量可以是字符常量或字符变量。其作用是将ch表示的字符写入fp所指向的文件的当前位置。假如函数运行正确,返回刚写入文件中的字符;运行错误,则返回EOF。被写入的文件可以用写(w)、读写(w+)、追加(a)方式打开。用写或读写方式打开一个已存在的文件时将清除原有的文件内容;如需保留原有文件内容,希望写入的字符以文件末开始存放,必须以追加方式打开文件。写入字符从文件开头开始,每写入一个字符,文件内部位置指针向后移动一个字节。14【例11-2】输入一行字符,将它存入文件,再读取文件内容并显示出来。#includestdio.hmain(){FILE*fp;charch;if((fp=fopen(input.txt,w+))==NULL){printf(Cannotopenfile);exit(0);}printf(inputastring:\n);ch=getchar();while(ch!='\n'){fputc(ch,fp);ch=getchar();}fclose(fp);if((fp=fopen(input.txt,r))==NULL){printf(Cannotopenfile);exit(0);}ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp);}fclose(fp);}输入:ilikeplayingfootball输出:ilikeplayingfootball1511.3.2字符串的读写字符串的读写是靠字符串函数来实现的。字符串读写函数在处理文件的数据时,是以字符串为单位的,每次读写的是一个一个的字符串。1.字符串读取函数fgetsfgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为:fgets(字符数组名st,n,文件指针fp);其中的n是一个正整数,表示从文件中读出的字符串不超过n-1个字符。函数的功能是从fp所指向的函数的当前位置读取n-1个字符,在读入的最后一个字符后加上串结束标志‘\0’,组成字符串后存入st指定的内存区。假如函数运行正确,则返回st的对应的地址;运行错误,则返回NULL。注意,在读完n-1个字符之前,假如遇到了换行符或EOF,则只读到该位置,补充字符串结束标志‘\0’,组成字符串,存入st对应的内存区。16【例11-3】读取input文件中的一个包含6个字符的字符串。#includestdio.hmain(){FILE*fp;charst[6];if((fp=fopen(input.txt,r))==NULL){printf(Cannotopenfile!);exit(0);}fgets(st,6,fp);printf(%s,st);fclose(fp);}输出结果为:ilike172.字符串写入函数fputsfputs函数的功能是向指定的文件写入一个字符串,其调用形式为:fputs(字符串st,文件指针fp);其中字符串可以是字符串常量,也可以是字符数组名,或指针变量。其功能是将st处存放的一个字符串,写入fp所指向的文本文件中。写入文件时,字符串结束标志并不写入文件。假如函数运行正确,则返回写入文件的实际字符数;运行错误,则返回EOF。例如:fputs(china,fp);其意义是把字符串“china”写入fp所指的文件之中。18【例11-4】在例11-2中建立的文件input.txt中追加一个字符串。#includestdio.hmain(){FILE*fp;charch,st[20];if((fp=fopen(input.txt,a))==NULL){printf(Cannotopenfile!);exit(0);}printf(inputastring:\n);scanf(%s,st);fputs(st,fp);fclose(fp);if((fp=fopen(input.txt,r))==NULL){printf(Cannotopenfile);exit(0);}ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp);}fclose(fp);}输入:china输出:ilikeplayingfootballchina1911.3.3数据块的读写C语言提供了用于整块数据的读写函数,可用来读写一组数据,如一个数组元素,一个结构变量的值等。数据块读写函数在处理文件中的数据时,是以字节数已经确定的1块数据为单位的,每次读取若干块数据。1.数据块读取函数freadfread函数实现数据块从指定文件中读取一块一块的数据,其调用的一般形式是:fread(buffer,size,n,fp)其中,buffer为存放数据的内存区首地址;size为无符号整型数,表示每块数据的字节数;n也是无符号整型数,表示每次读取的块数;fp为文件指针,指向打开的可读文件。该函数的功能是从fp所指向的文件中读取n块字节数为size大小的数据块,将这些数据块存入buffer指定的内存区。假如函数执行正确,则返回n值;错误,则返回NULL值。202.数据块写入函数fwritefscanf函数实现将一块一块的数据写入指定的文件,其调用的一般形式为:fwrite(buffer,size,n,fp);其中,buffer为存放数据的内存区首地址;size为无符号整型数,表示每块数据的字节数;n也是无符号整型数,表示每次写入的块数;fp为文件指针,指向已打开的可写文件。该函数的功能是将buffer指向的内存区域的n块字节数为size的数据块写入fp所指向的文件。假如函数运行正确,则返回n值;运行错误,则返回NULL值。使用数据块读写函数时,要注意以下几点:读写数据块函数的对应文件可以是文本文件,也可以是二进制文件。size表示数据块长度,一般用sizeof
本文标题:C语言程序设计教程-第11章
链接地址:https://www.777doc.com/doc-3262446 .html