C教材配套幻灯片第8章_第1页
C教材配套幻灯片第8章_第2页
C教材配套幻灯片第8章_第3页
C教材配套幻灯片第8章_第4页
C教材配套幻灯片第8章_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章 文件系统《C语言程序设计》

2学习目标与要求1、理解文件、文件系统、文件指针的概念2、了解文件的分类情况,掌握文本文件与二进制文件区别3、掌握文件的打开和关闭的含义,会合理使用各种不同的打开方式4、掌握使用字符读写函数、字符串读写函数、数据块读写函数、格式读写函数、和定位函数对文件进行顺序或随机读写5、能编写对文件进行处理的实用程序《C语言程序设计》

3本章要点文件系统

文件的打开与关闭文件的字符读写文件的字符串读写文件的数据块读写文件的格式化读写文件的定位小结《C语言程序设计》

4文件系统“文件”是指一组相关数据的有序集合。为了标识一个文件,每个文件都必须有一个文件名。其一般结构为:主文件名.[扩展文件名]。主文件的命名规则遵循操作系统的规定,扩展名表示文件的类型。例如:一个C语言源程序扩展名为“c”,扩展名有时也可以省略。《C语言程序设计》

5从不同的角度可对文件作不同的分类。1、按文件的组织形式分类(1)顺序存取文件顺序存取文件是指存取文件只能从头开始,顺序存取各个数据。(2)随机存储文件随机存储文件是指可先移动文件内部的位置指针到需要读写的位置,再进行存取其中数据。《C语言程序设计》

62、按记录的逻辑结构分类(1)记录文件具有一定结构的记录组成,可以指定长度,也可以不指定长度。如数据库文件。(2)流式文件由一连串的字符(字节)数据顺序组成。如C系统,把文件都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制,更灵活。《C语言程序设计》

73、按文件的内容来分类(1)程序文件程序文件是由程序代码组成的有序集合,又可分为源文件、目标文件和可执行程序。(2)数据文件数据文件是由一系列数据组成的有序集合,如各种输入输出数据,包括文档文件、图形文件和声音文件。《C语言程序设计》

84、按数据的组织形式来分类(1)文本文件又称ASCII码文件,在磁盘中存放字符对应的一个字节的ASCII码。例如,数12345的存储形式为:字符形式ASCII码(十进制)ASCII码(二进制)'1'4900110001'2'5000110010'3'5100110011'4'5200110100'5'5300110101《C语言程序设计》

9(2)二进制文件按二进制的编码方式来存放文件。例如,数12345的存储形式为:0011000000111001只占二个字节。当用户建立的文件主要是为了进行数据处理时,最好建立成二进制文件,可以提高速度;如果是为了输出到显示器或打印机供人们阅读,则建立成文本文件更恰当。《C语言程序设计》

105、按存储介质分类(1)普通文件驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件、目标文件、可执行程序;也可以是一组待输入处理的原始数据,或者是一组输出的结果。(2)设备文件设备文件是指与主机相联的各种外部设备,如显示器、打印机、键盘等。C语言编译程序把各种输入输出设备也当作文件处理。《C语言程序设计》

11typedef

struct{shortlevel;unsignedflags;charfd;

unsignedcharhold;shortbsize;

unsignedchar*buffer,*curp;unsignedistemp;shorttoken;

}FILE;TurboC中在头文件“stdio.h”中,定义了FILE结构体类型。《C语言程序设计》

12程序说明:level短整型变量,数值表示缓冲区“满”或“空”的程度;无符号整型变量flags标识文件的状态;字符变量fd为文件描述符即表示文件名;如无缓冲区则不读取无符号字符型变量hold的值;短整型变量bsize表示缓冲区的大小;指针buffer指向数据缓冲区的位置,指针curp表示当前指针的指向;istemp是指向临时文件的指示器;短整型变量token用于进行有效性检查。注意:其中FILE应为大写,它是由系统定义的一个结构。《C语言程序设计》

13在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。定义文件指针。格式如下:FILE*指针变量标识符;例如:FILE*fp;表示fp是指向FILE结构的指针变量,通过fp就可找存放某个文件信息的结构变量,然后按结构变量提供的信息找到该文件,实施对文件的操作。习惯上把fp称为指向一个文件的指针。《C语言程序设计》

14注意:文件的读写指针不同与文件指针,文件指针用来指向整个文件的,即指向所指文件的“文件信息区”的地址,须在程序中定义说明。对某个被打开的文件来说,只要不重新赋值,该文件的指针是不会改变。《C语言程序设计》

15C语言提供两种文件处理方式:缓冲文件系统和非缓冲文件系统。缓冲文件系统功能强、使用方便,但效率稍低,而非缓冲文件系统执行效率高。缓冲文件系统和非缓冲文件系统都是通过标准库函数实现文件的操作。本章只介绍缓冲文件系统下的文件操作,这些操作都是用库函数来实现的。《C语言程序设计》

16文件的打开与关闭在进行文件操作之前要先打开文件,使用完毕要关闭。所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其它操作。关闭文件则断开指针与文件之间的联系,也就禁止再对该文件进行操作。在C语言中,文件操作都是由库函数来完成的,这些函数在头文件“stdio.h”中。《C语言程序设计》

17文件的打开(fopen函数)它的原型如下:FILE*fopen(constchar*,constchar*mode);说明:1、形参是一个字符指针变量,指向字符型数据。调用时,实参一般用字符串常量或字符数组名,它们表示要打开的文件名,文件名前面可以带路径。2、形参mode也是一个字符指针变量,指向字符型数据,调用时,实参一般用字符串,表示打开文件的方式。《C语言程序设计》

18它由两类字符构成,一类字符表示打开文件的类型,文本文件(text)用字符“t”表示;二进制文件(binary)用字符“b”表示,如省略则默认为文本文件。另一类字符表示文件的使用方式,它有12种。为了便于记忆,我们把12个文件的使用方式分为两组,第一组为基本方式,有读或写两者之一的功能;第二组为增强方式,用“+”表示,有读和写两个功能。每组又分为文本文件和二进制文件两种方式,每种文件都有“r”、“w”、“a”这3种基本字符,分别表示读、写和追加方式。《C语言程序设计》

20要注意的是在实参字符串中,文件的使用方式在前,文件的类型符在后,如"rb"、"wb",不可写成"br"、"bw"。对于“+”来说,可以放在文件的使用方式的右边,也可以放在文件的类型符的右边,但不可放在文件的使用方式的左边。如“w+b”或“wb+”都是正确的,而“+wb”则是错误的。《C语言程序设计》

213、此函数的功能是按指定的方式打开文件。如果文件打开成功,则返回该文件结构体的指针;如果读文件时文件不存在,或者写文件时文件不能创建则打开失败,则返回NULL。4、函数的调用的一般形式为:文件指针名=fopen(文件名,使用文件方式);例如:FILE*fp;fp=("f.txt","r");其意义是在当前目录下打开文本文件f.txt,只允许进行“读”操作,并使fp指向该文件。《C语言程序设计》

22又如:FILE*gp;gp=("c:\\bx\\abc","rb");其意义是打开C驱动器磁盘的根目录下bx文件夹中的文件abc,这是一个二进制文件,只允许按二进制方式进行读操作。两个反斜线“\\”中的第一个表示转义字符,第二个表示文件路径的逐级目录分隔符。5、fopen函数一次只能打开一个文件,如需打开多个文件,则要多次调用该函数。《C语言程序设计》

23【例8-1】以读方式打开C盘根目录下bx文件夹中的文件abc,如果打开失败,则退出系统。#include<stdio.h>voidmain(){FILE*gp;gp=fopen("c:\\bx\\abc","rb");if(gp==NULL){printf("\nthisfoundorcan'topen,strikeanykeyexit!");getch();exit(0);}}《C语言程序设计》

24

程序运行情况:thisfoundorcan'topen,strikeanykeyexit!

程序说明:因为事先没有在C盘根目录下bx文件夹中创建文件abc,则返回的指针为空,给出提示信息“thisfoundorcan'topen!”。getch()语句的作用是从键盘输入一个字符,但不在屏幕上显示。在这里的作用是等待,用户可利用这个等待时间阅读出错提示,只有当用户从键盘敲任一键时,程序才继续执行exit(0)语句,退出程序。《C语言程序设计》

25文件关闭函数(fclose函数)文件一旦使用完毕,应该用关闭文件函数把文件关闭,以避免文件的数据丢失等错误。它的原型为:int*fclose(FILE*fp);说明:1、形参fp是一个文件指针变量,通常这个参数就是fopen函数的返回值。2、此函数的功能是关闭文件指针fp所指向的文件。如果正常关闭了文件,则函数的返回值为0;如果有错误发生,则返回EOF。EOF是在头文件“stdio.h”中定义的符号常量,其值为-1。《C语言程序设计》

263、函数调用的一般形式是:fclose(文件指针);例如:fclose(fp);我们应该养成在程序终止之前关闭所有文件的习惯。只有用fclose函数关闭文件,才可以避免缓冲区的数据丢失。fclose函数一次只能关闭一个文件,如需关闭多个文件,则要多次调用该函数。《C语言程序设计》

27文件的读写读文件是将磁盘文件中的数据传送到计算机内存的操作,写文件是从计算机内存向磁盘文件传送数据的操作。文件的读写函数主要包括:字符读写函数(fgetc和fputc)字符串读写函数(fgets和fputs)数据块读写函数(freed和fwrite)格式化读写函数(fscanf和fprinf)《C语言程序设计》

28文件的字符读写字符读写函数fgetc和fputc是以字符(字节)为单位的读写函数。每次可从文件读出或向文件写入一个字符。1、写字符函数fputc它的原型如下:intfputc(intc,FILE*fp);说明:(1)该函数功能是将字符数据c输出到文件指针fp所指向的文件中去,同时将文件的读写指针向后(向下)移动一个字节(字符),即指向下一个写入位置。《C语言程序设计》

29(2)如果输出成功,则函数的返回值就是字符数据c的ASCII码值;否则返回EOF(-1)。可用此来判断写入是否成功。(3)函数调用的形式为:fputc(字符量,文件指针);例如:fputc('a',fp);其意义是把字符a写入fp所指向的文件中。其中,待写入的字符量可以是字符常量或变量。又如:fputc(c,stdout);该语句等价于putchar(c);表示将字符变量c的内容输出到终端,一般指显示器。《C语言程序设计》

30注意:在fputc函数调用中,被写入的文件可以用写、读写,追加方式打开。用写或读写方式打开一个已存在的文件时将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件内容,希望写入的字符以文件末开始存放,必须以追加方式打开文件。被写入的文件若不存在,则创建该文件。《C语言程序设计》

31【例8-2】从键盘输入一行字符,把它们显示在屏幕上,同时写入当前目录下的“”文件中。程序运行情况:inputastring:China↙China程序示例《C语言程序设计》

32程序说明:①语句if((fp=fopen("","w"))==NULL)等价于fp=fopen("","w");if(fp==NULL)两条语句。因为逻辑运算符的优先级高于赋值运算符,语句fp=fopen(“”,“w”);两边一定要加上括号。该语句的功能是先以只写方式打开文件"",并使指针变量fp指向该文件,接着判断fp是否为空。《C语言程序设计》

33②通过while语句将一行字符输出到屏幕上,同时写入文件中。③最后用fclose函数关闭文件,把缓冲区的数据输出到磁盘文件,并且释放文件指针变量。④本程序运行后,会在当前目录创建一个包含有“China”这几个字符的“”文件。可直接用记事本打开该文件,也可以在DOS状态下,输入“type”命令查看文件内容。《C语言程序设计》

342、读字符函数fgetc它的原型如下:intfgetc(FILE*fp);说明:(1)该函数功能是从文件指针fp所指向的文件中,读入一个字节(字符),同时将文件的读写指针向后(向下)移动一个字节(字符),即指向下一个读入位置。(2)如果读取正常,返回读到的字节值;如果读到文件尾或出错,则返回EOF(-1)。《C语言程序设计》

35(3)函数调用的一般形式为:字符变量=fgetc(文件指针);例如:ch=fgetc(fp);其意义是从打开的文件fp中读取一个字符并赋给变量ch。再如:fgetc(stdin);该语句等价于getchar();表示从键盘中读取一个字符。注意:在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。在文件打开时,文件的读写指针总是指向文件的第一个字节。使用fgetc函数后,该位置指针将向后移动一个字节。《C语言程序设计》

36(4)判断文件是否结束。方法一:用EOF来判断文件,部分语句如下:while((ch=fgetc(fp))!=EOF)…方法二:用函数feof用来判断文件是否结束。如果遇到文件结束,函数的返回值为1,否则为0。部分语句为:while(!feof(fp)){ch=fgetc(fp);…}当读取文本文件时,可以用上述两种方法判断文件是否结束。但当读取二进制文件时,只可以用第二种方法。因为二进制文件中某一字节内容可以是-1,即可能等于EOF,而文本文件中字符的ASCII码值总是大于等于0。《C语言程序设计》

37【例8-3】在屏幕上输出上例生成的文件“”的内容。程序运行情况:thecontentofthis程序说明:①本程序先以只读方式打开文件"",并使指针变量fp指向该文件,如果文件""没通过上例生成,则可用记事本建立,否则程序会显示"thisfoundorcan'topen!"提示错误信息。程序示例《C语言程序设计》

38②通过while语句将文件""中的所有字符输出到屏幕上。每执行一次循环,从文件的读写指针所指的读写位置处读入一个字符赋给变量ch,然后判断该字符是否是文件的结束标识EOF,若是,结束循环;否则,将该字符显示在屏幕上,再读入下一字符。每读一次,文件的读写指针向后移动一个字符,文件结束时,该指针指向EOF。③最后用fclose函数关闭文件,释放文件指针变量。《C语言程序设计》

39【例8-4】设计一个程序,实现文本文件的复制。程序运行情况:Enterthesource:↙Enterthedestination:↙程序说明:①在提示“Enterthesource:”时,用户输入源文件名"",赋给字符数组file1,接着用fopen函数的读方式打开该文件,使指针fp1指向文件""。程序示例《C语言程序设计》

40②在提示“Enterthedestinationname:”时,用户输入目标文件名"",赋给字符数组file2,接着用fopen函数的写方式打开该文件,使指针fp2指向文件""。③while语句的作用是将文件""中的所有字符输出到文件""中,每执行一次循环,先用feof函数来判断文件是否结束,若是,结束循环,否则,从文件""的读写指针所指的读写位置处读入一个字符,并且写入到""的读写指针所指的读写位置处。《C语言程序设计》

41④最后用fclose函数关闭两个文件。上述程序是按文本文件方式处理的。如要复制的文件为二进制文件,只需要将两个fopen函数中的"r"改成"rb"、"w"改成"wb"即可。有时我们希望像使用DOS中的copy命令一样,在输入命令时连着两个文件名一起输入,这就要用到命令行参数,同时我们要把上例程序改写成带参数的main函数。【例8-5】带参数的main函数。程序示例《C语言程序设计》

42程序说明:程序中定义了两个文件指针fp1和fp2,分别指向命令行参数中给出的文件。如果输入的参数不为三个,则程序会给出“Youmustenterthesourcethedestination:”的错误提示,提醒用户必须输入源文件和目标文件名。while循环的作用是逐个读出文件1中的字符再送到文件2中。《C语言程序设计》

43假设本程序的源文件保存为8-5.c,经过编译连接后得到的可执行文件名为8-5.exe,则在DOS命令工作方式下,输入可执行文件名“8-5源文件名目标文件名”。注意,此程序要运行成功,必须先建立好提供复制的源文件。例如输入:8-5↙此命令行共有3个参数,因此argc的值为3,同时传递参数"8-5"给argv[0]、""给argv[1]、""给argv[2],程序运行后就把""文件中的内容复制到""中。我们可以打开这两个文件查看,或用type命令验证。《C语言程序设计》

44还要说明的是,TurboC系统在库文件"stdio.h"把fputc和fgetc函数定义为宏名putc和getc,语句如下:#defineputc(ch,fp)fputc(ch,fp)#definegetc(fp)fgetc(fp)为了书写方便,我们经常用putc函数代替fputc函数,用getc函数代替fgetc函数。《C语言程序设计》

45文件的字符串读写字符串读写函数fgets和fputs是以字符串的形式对文件进行读写的函数。每次可从文件读出(指定长度)或向文件写入一个字符串。1、写字符串函数fputs它的原型如下:intfputs(constchar*s,FILE*fp);说明:《C语言程序设计》

46(1)该函数功能是将指针s所指向的字符串写到文件指针fp所指向的文件中去,同时将文件的读写指针向后(向下)移动字符串长度个字节(字符)。注意,fputs函数不会将字符串结束符'\0'写入文件,也不会自动向文件写入换行符,所以输出到文件中的各字符串连在一起,没有分隔符。为了便于以后从文件中读数据时能区分各字符串,s字符串中要包含换行符'\n',也可以单独使用函数fputs("\n",fp)或函数fputc('\n',fp)。请注意这两个函数用法上的区别。《C语言程序设计》

47(2)如果操作成功,函数的返回值就是最后写入文件的字符值;否则返回EOF(-1)。(3)函数调用的形式为:fputs(字符串,文件指针);例如:fputs("abcd",fp);其意义是把字符串"abcd"写入fp所指的文件之中。又如在语句fputs(str,fp);中,str可以是字符串常量,也可以是存放字符串的字符数组名,或指向字符串的指针变量。《C语言程序设计》

48【例8-6】从键盘输入若干行字符,把它们追加到例8-2中建立的“”文件中。程序运行情况:inputastring:Howareyou?↙inputastring:Iamfine.↙inputastring:↙程序说明:①本例要求在""文件追加字符串,因此,用fopen函数的追加方式打开该文件。程序示例《C语言程序设计》

49②在while语句中,先调用gets函数从键盘输入一行字符,送到字符数组s中,若输入的字符串为空,跳出循环;否则,输出换行符,接着把此字符串输出到文件""中。③最后用fclose函数关闭文件,把缓冲区的数据输出到磁盘文件,释放文件指针变量。④在例8-2程序执行后,""文件的内容为“China”。本程序运行后,文件的内容,有三行:ChinaHowareyou?Iamfine.《C语言程序设计》

502、读字符串函数fgets它的原型为:int*fgets(char*s,intn,FILE*fp);说明:(1)该函数功能是从文件指针fp所指向的文件中,读入长度最多为n-1的字符串,并在字符串的末尾加上串结束标志'\0',然后将字符指针s指向字符串的首地址。同时将读写指针向后(下)移动实际读取的字符串长度个字节。注意,读入的字符串长度可能小于等于n-1,因为当从文件中读取第n-1个字符后或读取数据过程中遇到换行符'\n'后,《C语言程序设计》

51函数就会返回。如果遇到的是换行符,它也将作为字符串的一部分。(2)如果读取正常,返回读取到的字符串的首地址s;如果读到文件尾或出错,则返回NULL。(3)函数调用的形式为:fgets(字符串起始地址,n,文件指针);例如:在语句fgets(str,n,fp);中,str用来存放字符串的起始地址,可以是字符数组名或指向足够存储空间的字符指针。《C语言程序设计》

52【例8-7】从上例生成的文件“”中读回字符串,并显示在屏幕上。程序运行情况:thecontentofthis:ChinaHowareyou?Iamfine.程序说明:程序在运行时,在屏幕上按行输出""文件中的所有字符。因为读入的字符串中已包含'\n',字符串还是分行输出。程序示例《C语言程序设计》

53文件的数据块读写C语言还提供了用于整块数据的读写函数fread和fwrite。可用来读写一组数据,如一个数组元素,一个结构变量的值等。fread和fwrite一般用于二进制文件的输入输出。1、写数据块函数fwrite它的原型为:size_tfwrite(constvoid*ptr,size_tsize,size_tn,FILE*fp);说明:《C语言程序设计》

54(1)该函数功能是将ptr所指向的内存中存放的n个大小为size个字节的数据项写入到fp所指向的文件中,实际要写入数据的字节数是n*size。同时,将读写指针向后(下)移动n*size个字节。(2)如果操作成功,则函数返回值就是读取的数据项的个数(不是字节数),如果操作出错,则返回0。《C语言程序设计》

55(3)调用的一般形式为:fwrite(buffer,size,count,fp);其中buffer是一个指针,它表示存放输出数据的首地址。size表示数据块的字节数。count表示要读写的数据块块数。fp表示文件指针。例如:fwrite(fa,2,5,fp);其意义是把数组fa的首地址开始的数据,写入到指针fp所指的文件中,每次写2个字节(一个整数),连续写5次。《C语言程序设计》

56【例8-8】从键盘上输入一批学生的数据(包括姓名、学号、成绩),将它们存放到二进制文件“student”中。程序运行情况:zhangsan200600190↙Haveanotherrecord(y/n)?y↙lisi200600288↙Haveanotherrecord(y/n)?y↙wangwu200600393↙Haveanotherrecord(y/n)?n↙程序示例《C语言程序设计》

57程序说明:①先定义结构体数组stu有40个元素,每一个元素用来存放一位学生的姓名、学号、成绩三项数据。②在do…while语句中,首先从键盘输入的数据给数组元素stu[i],并输出到文件。其中函数sizeof(stu[i])用来计算出一个数据块的大小,也可以用sizeof(structstudent)代替,或者写成16(表示一个student类型结构体变量的长度)。输完一个学生数据后,i自增1,接着询问用户是否有下一个学生数据?若输入为'Y'或'y',则继续循环,否则结束循环。《C语言程序设计》

58③程序中第一个getchar()函数的作用是接收在执行scanf语句时最后输入的回车符,此处不能省略,否则程序只能循环一次。④注意输入数据的情况,学生数据输入时是ASCII码,也就是文本文件。在送到计算机内存时,存成二进制形式,其中回车和换行符两个符号转换成一个换行符。再从内存以"wb"方式(二进制写)输出到文件"student",此时不需发生转换,当你查看文件"student"内容时,发现里面有一些不能读懂的字符,这就是与文本文件的区别。

《C语言程序设计》

592、读数据块函数它的原型为:size_tfread(void*ptr,size_tsize,size_tn,FILE*fp);说明:(1)该函数功能是从文件指针fp所指向的文件中,读取n个数据项,每个数据项的大小是size个字节,这些数据将被存放到ptr所指向的内存中。同时,将读写指针向后(下)移动n*size个字节。(2)如果操作成功,则函数返回值就是读取的数据项的个数(不是字节数),如果读到文件尾或出错,则返回0。《C语言程序设计》

60(3)调用的一般形式为:fread(buffer,size,count,fp);其中buffer是一个指针,它表示存放输入数据的首地址。size表示数据块的字节数。count表示要读写的数据块块数。fp表示文件指针。例如:fread(fa,4,5,fp);其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中。《C语言程序设计》

61【例8-9】从上例生成的二进制文件“student”中读回学生数据,并显示在屏幕上。程序运行情况:name:zhangsan num:2006001 score:90name:lisi num:2006002 score:88name:wangwu num:2006003 score:93程序说明:①程序中的while语句中将文件"student"中的学生数据逐个读出,然后输出在终端屏幕上。程序示例《C语言程序设计》

62函数fread(&stu[i],sizeof(stu[i]),1,fp)就是读取一个学生的数据,如果操作成功就返回1,可以继续循环,否则,结束循环。②注意输出数据的情况,fread函数从"student"文件向内存读入数据,该文件是二进制文件,且是用"rb"方式(二进制读)打开的,因此数据按原样输入,不发生字符转换,这时候内存中的数据又恢复到上一程序从键盘输入数据后的情况。从屏幕上显示的情况来看,换行符又转换为回车加换行符。《C语言程序设计》

63文件的格式化读写C语言提供了对文件进行格式化读写的函数fscanf和fprinf。二者的功能与我们前面学习的格式化输入、输出函数scanf和prinf相似,区别在于fscanf和fprinf函数的操作对象是文件,而scanf和prinf函数的操作对象是标准输入(stdin)、输出(stdout)文件,即键盘和显示器。1、fprinf函数它的原型如下:intfprinf(FILE*fp,constchar*format,…);说明:《C语言程序设计》

64(1)该函数功能是将表达式输出到fp所指向文件中,如果操作成功,则返回值就是写入到文件中数据的字节个数;如果操作出错,则返回EOF。(2)调用的一般形式为:fprintf(文件指针,格式字符串,输出表列);如:fprintf(fp,"%d,%c",a,ch);其意义是将变量a和ch按"%d%c"的格式输出到fp所指指向文件中。又如:fprintf(stdout,"%6.3f",x);等价于printf("%6.3f",x);其意义是将变量x按"%6.3f"的格式输出到终端显示器上。《C语言程序设计》

652、fscanf函数它的原型如下:intfscanf(FILE*fp,constchar*format,…);说明:(1)该函数功能是从fp所指向的文件中读取数据。如果操作成功,则函数返回值就是读取的数据项的个数;如果操作出错或遇到文件尾,则返回EOF。(2)调用的一般形式为:fscanf(文件指针,格式字符串,输入表列);《C语言程序设计》

66例如:fscanf(fp,"%d,%c",&a,&ch);其意义是从fp所指向的文件中读取一个整型数据、逗号、一个字符数据。其中整型数据赋给变量a,字符数据赋给变量ch。又如:fscanf(stdin,"%f",x);等价于scanf("%f",x);其意义是从标准输入文件(键盘)上读入一个浮点数给变量x。使用fscanf和fprinf函数,应注意以下几个问题:(1)fscanf和fprinf函数适用与文本文件,一般来讲,由fprinf函数写入磁盘中的数据,应由fscanf函数以相同格式从磁盘文件读出来使用。《C语言程序设计》

67例如:例8-8中语句fwrite(&stu[i],sizeof(stu[i]),1,fp);可以用语句fprintf(fp,"%s%ld%d\n",stu[i].name,stu[i].num,stu[i].score);代替;相应的例8-9中语句“while(fread(&stu[i],sizeof(stu[i]),1,fp)==1);”可以用语句“while(fscanf(fp,"%s%ld%d\n",stu[i].name,&stu[i].num,&stu[i].score)!=EOF)”代替。《C语言程序设计》

68注意:在fprintf格式串中用空格作为各项之间的分隔符,用换行作为各个学生数据的分隔符,在fread格式串中也要用空格作为各项之间的分隔符,换行符‘\n’也不能省略,否则读出的数据有误。(2)用fscanf和fprinf函数对磁盘文件读写,使用方便,容易理解。但由于在输入是要将ASCII码转换为二进制形式存入内存,在写入文件时又要将二进制形式转换为ASCII码,花费时间较多,而使用fread和fwrite函数转换就简单的多了。《C语言程序设计》

69文件的定位前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从打开位置开始,顺序读写各个数据。但在实际问题中常要求只读写文件中某一指定的部分。为了解决这个问题可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。文件定位移动文件内部位置指针的函数主要有两个,即rewind函数和fseek函数。如果想知道文件读写指针的位置,可以调用ftell函数。《C语言程序设计》

701、rewind函数它的原型如下:voidrewind(FILE*fp);说明:(1)该函数功能是将fp所指向文件的读写指针重新移动到文件的开头,该函数没有返回值。(2)调用的一般形式为:rewind(文件指针);例如:rewind(fp);《C语言程序设计》

712、fseek函数它的原型如下:intfseek(FILE*fp,longoffset,intwhence);说明:(1)该函数功能是将fp所指文件的读写指针移动到特定位置。这个特定位置是由参数offset和whence决定的,即将读写指针移到距离whence的offset字节处。whence的值见表8-2。如果offset为正值,表明新的位置在whence的后(下)面,如果offset为负值,表明新的位置在whence的前(上)面。《C语言程序设计》

72表2-2whence的常量值及含义(2)如果操作成功,返回值为0,否则返回一个非零值。《C语言程序设计》

73(3)调用的一般形式fseek(文件指针,位移量,起始点);“位移量”表示移动的字节数,要求long型数据,以便在文件长度大于64KB时不会出错。常量表示位移量时,加后缀“L”。例如:fseek(fp,10L,0);把位置指针移到离文件首10个字节处。fseek(fp,80L,1);把位置指针移到离当前位置80个字节处。fseek(fp,-30L,2);将位置指针从文件末尾向前(向上)退30个字节。《C语言程序设计》

74(4)利用fseek函数就可以实现随机读写了。还要说明的是fseek函数一般用于二进制文件。在文本文件中由于要进行转换,故往往计算的位置会出现错误。文件的随机读写在移动位置指针之后,即可用前面介绍的任一种读写函数进行读写。由于一般是读写一个数据块,因此常用fread和fwrite函数。《C语言程序设计》

753、ftell函数它的原型为:longftell(FILE*fp);说明:(1)该函数功能是返回fp所指向文件的读写指针的值,该值用相对文件开头的位移量(字节数)表示,是long型数据。如果出错,则返回-1L。(2)调用的一般形式为:ftell(文件指针);例如:x=ftell(fp);注意此处x要定义为long型变量。《C语言程序设计》

76【例8-10】从键盘输入一个实型float数组a的十个元素并存放到二进制文件"f.dat"中,输出文件的长度(字节数),然后从文件读取奇数位置的五个数据到实型数组b中,并在屏幕上输出数组b中的所有元素,及元素之和。程序示例《C语言程序设计》

77程序运行情况:1.22.33.44.55.66.77.88.99.010.1↙thecurrentbytenumber:40afterrewindthecurrentbytenumber:01.2000003.4000005.6000007.8000009.00000027.000000程序说明:①本例要求先把数据写入文件中,然后从文件中读取数据,因此,用fopen函数的"wb+"二进制读写方式打开该文件。《C语言程序设计》

78②语句fwrite(a,4,10,fp);的作用是把数组a的首地址开始的数据,写入到指针fp所指的文件中,每次写4个字节(一个实数),连续写10次。注意此时文件读写指针的位置已经向下移动了40(4*10)字节,即指向文件末尾,可以从输出的ftell(fp)的值为40得到验证。③语句rewind(fp);的作用是使读写指针又指向文件的开头,我们从输出的ftell(fp)的值为0得到验证。如果遗漏该语句,直接用函数fread读取数据,此时指针指向文件末尾,读取的数据是没有意义的。《C语言程序设计》

79④for循环执行5次,在每一次循环中,语句fread(&b[i],4,1,fp)的作用是从

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论