您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > C/C++资料 > C语言b程序b设计(3)
C语言程序设计主讲:沈济南TEL:13971887071E-mail:shenjinan@163.com第二十讲主讲内容:第十章文件10.1文件的基本概念10.2文件类型指针10.3文件的打开与关闭10.4文件的读写操作10.5文件的随机读写操作10.6文件检测函数10.1文件的基本概念10.1.1文本文件与二进制文件C语言中文件并不是由记录(record)组成的。根据数据的组织形式,可分为ASCII文件和二进制文件。ASCII文件又称文本(text)文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。10.1.2缓冲文件系统和非缓冲文件系统目前C语言所使用的磁盘文件系统有两大类:一类称为缓冲文件系统,又称为标准文件系统;另一类称为非缓冲文件系统。缓冲文件系统的特点是:系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。非缓冲文件系统不由系统自动设置缓冲区,而由用户自己根据需要设置。10.2文件类型指针使用文件必须包含库头文件stdio.h,且要先定义。文件定义的一般格式:FILE文件指针;FILE文件缓冲区的类型名,必须大写。文件指针指向文件缓冲区的指针。例如,FILE*fp;10.3文件的打开与关闭文件处理必须包含三个基本过程:打开文件,读或写,关闭文件。10.3.1文件的打开所谓“打开”是在程序和操作系统之间建立起联系,程序把所要操作的文件的一些信息通知给操作系统。文件的打开通过Fopen函数实现。它的调用方式为:FILE*fp;fp=fopen(文件名,使用文件方式);文件名中可以包含路径,例如:fp=fopen(d:\a1.txt,r)⑴在打开一个文件时,通常要通知给编译系统以下三个信息:⑵需要打开的文件名,也就是准备访问的文件的名字;⑶使用文件的方式(读还是写等);⑷让哪一个指针变量指向被打开的文件。使用文件方式见表10.1。10.3.1文件的打开对于文件使用方式有以下几点说明:(1)文件使用方式字符的含意r(read)读w(write)写a(append)添加t(text)文本文件,可省略不写b(binary)二进制文件+读和写(2)用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据,而且该文件应该已经存在,不能打开一个并不存在的用于“r”方式的文件(即输入文件),否则出错。(3)用“w”方式打开的文件只能用于向该文件写数据,而不能用来向计算机输入。如果原来不存在该文件,则在打开时新建立一个以指定名字命名的文件;如果原来已存在一个以该文件名命名的文件,则在打开时将该文件删去,然后重新建立一个新文件。(4)如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开。但此时该文件必须已存在,否则将得到出错信息。打开时,位置指针移到文件末尾。(5)用“r+”、“w+”、“a+”方式打开的文件可以用来输入和输出数据。用“r+”方式时该文件已经存在,以便能向计算机输入数据。“w+”方式则新建立一个文件,先向此文件写数据,然后可以读此文件中的数据。用“a+”方式打开的文件,原来的文件不被删去,位置指针移到文件末尾,可以添加也可以读。(6)如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。此时fopen函数将带回一个空指针值NULL(NULL在stdio.h文件中已被定义0)。常用下面方法打开一个文件:if((fp=fopen(file1,r))==NULL){printf(cannotopenthisfile\n);exit(1);}即先检查打开有否出错,如果有错就在终端上输出cannotopenthisfile。exit函数的作用是关闭所有文件,终止正调用的过程。10.3.2文件的关闭文件使用完毕后必须关闭,以避免数据丢失。用fclose函数关闭文件。fclose函数调用的一般形式为:fclose(文件指针);例如:fclose(fp);fclose函数也带回一个值,当顺利地执行了关闭操作,则返回值为0;如果返回值为非零值,则表示关闭时有错误。可以用ferror函数来测试。10.4文件的读写操作常用的读写函数如下,这些函数的说明包含在头文件stdio.h中:字符读写函数:fgetc和fputc(getc和putc);字符串读写函数:fgets和fputs;数据块读写函数:fread和fwrite;格式化读写函数:fscanf和fprintf。10.4.1字符读写函数1.写一个字符到磁盘文件fputc函数把一个字符写到磁盘文件上去。其调用形式为:fputc(ch,fp);其中ch是要输出的字符,它可以是一个字符常量,也可以是一个字符变量,fp是文件指针。fputc(ch,fp)函数的作用是将字符(ch的值)输出到fp所指向的文件上去。fputc函数也带回一个值:如果输出成功则返回值就是输出字符;如果输出失败,则返回一个EOF。EOF是在stdio.h文件中定义的符号常量,值为-1。使用fputc函数时应注意,所操作的文件必须以写、读写或添加方式打开,另外,每写入一个字符后,文件内部的位置指针自动指向下一个字节。【例10.1】从键盘输入一行字符,写入到文本文件string.txt中。/*源程序名:CH1001.C*//*01*/#includestdio.h/*02*/voidmain()/*03*/{/*04*/FILE*fp;/*05*/charch;/*06*/if((fp=fopen(c:\\string.txt,w))==NULL)/*以写方式打开string.txt文件*//*07*/{/*08*/printf(can’topenfile,pressanykeytoexit!);/*09*/getchar();/*10*/exit(0);/*11*/}/*12*/do{/*13*/ch=getchar();/*不断接收字符并写入文件,直至遇到换行符为止*//*14*/fputc(ch,fp);/*15*/}while(ch!='\n');/*16*/fclose(fp);/*17*/}语句while中的’\n’是一个换行符。程序运行结束后可到DOS或Windows下查看刚建立的文件string.txt。10.4.1字符读写函数2.从磁盘文件中读入一个字符fgetc函数能够从指定文件中读入一个字符,其调用形式为:ch=fgetc(fp);fp为文件指针,ch为字符变量,fget函数带回一个字符,赋给ch。如果在执行fgetc读字符时遇到文件结束符,函数返回一个文件结束标志EOF,EOF在stdio.h中定义为-1。【例10.2】将磁盘上一个文本文件的内容复制到另一个文件中。/*源程序名:CH1002.C*//*01*/#includestdio.h/*02*/#includestdlib.h/*02*/voidmain()/*03*/{/*04*/FILE*fp_in,*fp_out;/*05*/charinfile[20],outfile[20];/*06*/printf(Entertheinfilename:\n);/*07*/scanf(%s,infile);/*08*/printf(Entertheoutfilename:\n);/*09*/scanf(%s,outfile);/*10*/if((fp_in=fopen(infile,r))==NULL)/*11*/{/*12*/printf(Can'topenfile%s\n,infile);/*13*/getchar();/*14*/exit(0);/*15*/}/*16*/if((fp_out=fopen(outfile,w))==NULL)/*17*/{/*18*/printf(can'topenfile%s\n,outfile);/*19*/getchar();/*20*/exit(0);/*21*/}/*22*/while(!feof(fp_in))/*23*/fputc(fgetc(fp_in),fp_out);/*24*/fclose(fp_in);/*25*/fclose(fp_out);/*26*/}以上程序是按文本文件方式处理的。也可以用此程序来复制一个二进制文件,只需将两个fopen函数的“r”和“w”分别改为“rb”和“wb”即可,此时,上述程序就相当于一条copy命令了。10.4.2字符串读写函数1.从磁盘文件中读入一个字符串fgets的作用是从指定文件中读入一个字符串。如:fgets(str,n,fp);从fp指向的文件输入n-1个字符,并把它们放到以str为起始地址的单元中。如果在读入n-1个字符结束之前遇到换行符或EOF,读入即结束。字符串读入后最后加一个’\0’字符,fgets函数返回值为str的首地址,若已到文件尾或出错,则返回NULL。10.4.2字符串读写函数2.写一个字符串到磁盘文件fputs函数的作用是向指定的文件输出一个字符串。如:fputs(China,fp);把字符串”China”输出到fp指向的文件。fputs函数中第一个参数可以是字符串常量、字符数组名或字符型指针。输出成功,函数值为0;失败时,为非零值。【例10.3】编制一个将文本文件中全部信息显示到屏幕上的程序。实际上它相当于DOS系统中的type命令。/*源程序名:CH1003.C*//*01*/#includestdio.h/*02*/#includestdlib.h/*03*/voidmain(intargc,char*argv[])/*04*/{/*05*/FILE*fp;/*06*/charstring[81];/*07*/if(argc!=2||(fp=fopen(argv[1],r))==NULL)/*08*/{/*09*/printf(can'topenfile);/*10*/exit(1);/*11*/}/*12*/while(fgets(string,81,fp)!=NULL)/*13*/printf(%s,string);/*14*/fclose(fp);/*15*/}【例10.4】在文本文件string.txt的末尾添加若干行字符。/*源程序名:CH1004.C*//*01*/#includestdio.h/*02*/#includestdlib.h/*03*/#includestring.h/*04*/voidmain()/*05*/{/*06*/FILE*fp;/*07*/chars[81];/*08*/if((fp=fopen(c:\\string.txt,a))==NULL)/*以添加方式打开string文件*//*09*/{/*10*/printf(cannotopenfile,pressanykeytoexit!);/*11*/getchar();/*12*/exit(1);/*13*/}/*14*/while(strlen(gets(s))0)/*从键盘读入一个字符串,遇空行则停止*//*15*/{/*16*/fputs(s,fp);/*写进指定文件*//*17*/fputs(\n,fp);/*补一个换行符*//*18*/}/*19*/fclose(fp);/*20*/}10.4.3数据块读写函数如果要一次读入一组数据(如一个数组元素、一个结构体变量的值等),则应使用fread函数和fwrite函数。数据块读写函数的调用形式为:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);其含义如下:buffer:是一个指针。对fread来说,它用于存放读入数据的
本文标题:C语言b程序b设计(3)
链接地址:https://www.777doc.com/doc-7634747 .html