谭浩强高等教育出版社第3版-第8章 文件_第1页
谭浩强高等教育出版社第3版-第8章 文件_第2页
谭浩强高等教育出版社第3版-第8章 文件_第3页
谭浩强高等教育出版社第3版-第8章 文件_第4页
谭浩强高等教育出版社第3版-第8章 文件_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

第八章文件主讲人:韩维良2023年1月15日C语言程序设计第一节文件的有关概念一、文件及其分类在信息处理的过程中,有很多信息需要存放到外部存贮器中,永久地存贮起来。而在外部存贮器中信息以文件的形式组织起来,每一个文件有一个文件名,系统按文件名对文件进行管理。文件:存放到外存中的有名称的一个有意义的信息集合。如:一张照片、一首歌曲、一个文档等。通过文件可以大批量处理数据,可以长时间的将信息存储起来。C语言程序设计两个特征:对一个数据集合可以用一个名字命名;可以长期保存在外部介质上与程序设计有关的文件,按内容来分,有:源程序文件、目标程序文件、可执行程序文件和数据文件等。C语言程序设计从文件内容的角度看,有两种类型的文件:(1)程序文件:内容是程序代码。包括源程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行文件(后缀为.exe)等。(2)数据文件。文件的内容不是程序,而是供程序运行时读写的数据,如在程序运行过程中输出到磁盘(或其他外部设备)的数据,或在程序运行过程中供读入的数据。如一批学生的成绩数据,或货物交易的数据等。数据文件类型二进制文件:以数据在内存中存储形式原样输出到磁盘上去。节省存储空间而且输入输出的速度快(不需转换)。例:50201,二进制表示为0110000101000001。字符代码/文本/ASCII码文件:是指文件的内容是由一个一个字符组成的,,每一个字节存放一个ASCⅡ码,代表一个字符。如:用记事本创建的文件、c语言的源程序文件。例如50201,共有5个字符,故共占5个字节。C语言程序设计例如,现有一个整数1234,如果按ASCⅡ码形式存入文件,要占4个字节,其存储形式如下:如果按二进制形式存入文件,则只占2个字节,其存储形式与内存中的存储形式相同,如下:

ASCII码00110001001100100011001100110100↓↓↓↓十进制数123400000100110100100011000100110000001100000011000000110000(1)(0)ASCII形式00000000000000000010011100010000二进制形式(10000)(0)(0)(0)00000000000000000010011100010000二进制形式(10000)在内存中文本文件中二进制文件中整数10000C语言程序设计用ASCⅡ码形式存入文件时一个字节代表一个字符,因而便于对字符进行逐个处理,也便于输出,但一般占存储空间较大,而且二进制形式与ASCⅡ码之间的转换需要时间。符合我们日常书面书写的习惯。用二进制形式存入文件则可以节省外存空间和转换时间,但一个字节并不对应一个字符,如果直接在屏幕上显示,则是乱码。C语言程序设计二、文件名每一个文件有一个唯一的文件标识,即文件名,以便用户识别和引用。文件名包括三部分:(1)文件路径(2)文件名主干(3)文件名后缀(扩展名、类型名)文件路径表示文件在外部存储设备中的位置。如:表示file1.dat文件存放在D盘中的CC目录下的temp子目录下面文件路径文件名主干文件名后缀D:\CC\temp\file1.datC语言程序设计如:f:\exe3\file1.txt在C语言程序代码中,要写成(转义字符)f:\\exe3\\file1.txtC语言程序设计三、文件的位置指针与读/写方式文件位置指针:系统为被操作文件设置一个位置指针,用于指向当前的读写位置(相当于钢笔头)。文件的位置指针的初始值:读或写操作时:初始值为文件头。追加操作时:文件尾。C语言程序设计四、两种基本操作1、读操作从文件中读出数据给程序中的变量,又称为输入。2、写操作将程序中变量的值写到文件中,又称为输出。在C语言中,对于输入、输出的数据都按“数据流”的形式进行处理。C语言程序设计五、存取方式1、顺序存取打开文件后,读写操作总是从文件的首部开始进行,从头到尾逐一进行。如同听录音机磁带中的歌曲。2、随机存取又称为直接存取,打开文件后,直接可以从指定的位置读写数据。如同光盘中的歌曲,随机点。C语言程序设计第二节流的创建与撤销一、FILE类型指针1、文件类型指针C语言程序可以同时处理多个文件,为了对每一个文件进行有效的管理,在打开一个文件时,系统会自动地在内存中开辟一个区,用来存放文件的有关信息(如文件名、文件状态等)。这些信息保存在一个结构体变量中,该结构体类型由系统定义,名为FILE。FILE定义在头文件stdio.h中。如同:住院给每个人设置一张床位卡,分配一个床号。C语言程序设计对每一个要进行操作的文件,都需要定义一个指向FILE类型结构体的指针变量,该指针称为文件类型指针。定义法:

FILE*指针变量;

如:FILE*fp;fp是一个指向FILE类型结构体的指针变量。当fp和某个文件建立关联之后,通过fp即可找到存放该文件信息的结构体变量,然后按结构体变量提供的信息找到该文件,实施对文件的操作。C语言程序设计2.标准文件(3个FILE型指针,系统自动打开)stdin:从键盘输入stdout和stderr:输出到屏幕要使用直接拿来用。二、流一个计算机系统要使用许多外部设备,如键盘、显示器、打印机、磁盘等。可以将设备—缓冲区—应用程序之间的输入输出过程抽象为“数据的流动”,并称为“流”(stream)。程序对文件的操作(读/写),首先要为文件建立一个相应的缓冲区,再通过缓冲区进行读写。程序数据区输入缓冲区输出缓冲区外部介质C语言程序设计读写文件时,为防止频繁地访问外存贮器(速度相对较慢),提高系统运行速度,在内存中专门开辟出一块区域。当读出文件中的数据时,先读一批数据,存至缓冲区,再由读语句读至变量中;缓冲区中的数据读完后,再次读下一批数据至缓冲区。当要写数据至文件时,先输出到缓冲区中,当缓冲区满了后,再一次性写至外存中,依次重复进行。二级存贮模式:CPU内存缓冲区外存写读内存C语言程序设计三、文件的打开与关闭——流的创建与撤销1、文件的打开在读写一个文件之前,必须先打开它。格式:

FILE*文件指针变量;文件指针变量=fopen(“文件名”,“文件操作方式”);

fopen函数的作用是以指定的方式打开指定的文件。如果文件打开成功,返回一个文件类型指针,如果文件打开失败,则返回一个空指针NULL。“文件名”指要打开文件的存放路径与文件名。“文件操作方式”指文件的类型和操作要求。C语言程序设计文本文件二进制文件C语言程序设计如:fp=fopen(“c:\\abc\\file.txt”,“r”);注意:’\’要双写。由于文件是独立于程序之外不易被控制的,所以调用文件是程序中最易出错的地方。打开文件也是如此,当打开文件出错时,函数fopen会返回一个空指针NULL,出错原因可能是以“r”方式打开一个不存在的文件,或者是磁盘已满等。一旦文件打开出错,后边的程序也将无法执行,好的习惯是先检查打开文件时是否出错,如果有错则提示给用户,并终止程序的执行,等用户检查出错误,修改后再运行该程序。所以通常打开文件的步骤如下:C语言程序设计FILE*文件指针变量;

文件指针变量=fopen(“文件名”,“文件使用方式”);if(文件指针变量==NULL){printf(“cannotopenthisfile\n”);exit(0);}exit(0)——结束程序的运行,头文件是:stdlib.h。

2、文件的关闭关闭文件:撤销与操作文件相关的流。即通过关闭操作,通知系统释放相应的文件信息区(结构体变量)。并输出文件缓冲区的内容(不论缓冲区是否已满)给文件。在使用完一个文件后应该及时关闭它,这是一个程序员应养成的良好习惯。如果使用完没有关闭文件,则不仅占用系统资源,还可能造成文件被破坏。格式:fclose(文件指针变量);fclose用来关闭文件指针变量所指向的文件。如果调用成功,返回数值0,否则返回一个非零值。C语言程序设计如:fclose(fp);关闭文件后,文件类型指针变量将不再指向和它所关联的文件,此后不能再通过该指针对原来与其关联的文件进行读写操作,除非再次打开该文件,使该指针变量重新指向该文件。两函数的头文件:stdio.hC语言程序设计第三节文件的顺序读/写一、文件的字符读/写1.写字符函数fputc()格式:fputc(字符数据,文件指针变量);功能:将字符数据所对应的一个字符写入到文件指针变量所指向的文件中去。字符数据是要写入到文件中的字符,它可以是一个字符常量,也可以是一个字符变量。如果函数调用成功返回所写字符的ASCII码值,出错时返回EOF。如:fputc(‘a’,fp);其执行结果是将字符a写入到fp所指向的文件中。C语言程序设计例:编写程序,将从键盘上输入的字符写到一个文本文件中,输入“*”结束。文件内存ch键盘getchar()fputc()C语言程序设计#include<stdio.h>#include<stdlib.h>main(){FILE*fp;charch;fp=fopen(“d:\\temp.txt","w");if(fp==NULL){printf(“不能建立指定文件!");exit(0);}while((ch=getchar())!='*')fputc(ch,fp);fclose(fp);}C语言程序设计2.读字符函数fgetc()

格式:

字符变量=fgetc(文件指针变量);功能:从文件指针变量指向的文件中读取一个字符。如果调用成功,返回读出的字符,文件结束或出错时返回EOF(-1);EOF:文件结束标志,读到EOF结束。如:ch=fgetc(fp);其中,ch是字符变量,fp为文件指针变量,fgetc函数将从fp指向的文件中读出一个字符并赋给变量ch。调用fgetc()函数,读取的文件必须是以读或读写方式打开。C语言程序设计例:读出文件lx1.txt中的字符,并显示在屏幕上。#include<stdio.h>#include<stdlib.h>main(){charch;FILE*fp;fp=fopen(“c:\\abc\\lx1.txt”,“r”);/*根的标志用双写/*/if(fp==NULL){printf("cannotopenthisfile\n");exit(0);}C语言程序设计ch=fgetc(fp);while(ch!=EOF)/*!eof(fp)*/{putchar(ch);ch=fgetc(fp);}fclose(fp);}注意:非当前目录用要双写转义引导符:\;屏幕内存ch文件fgetc()putcgar()C语言程序设计可精简为:#include<stdio.h>#include<stdlib.h>main(){FILE*fp;charch;fp=fopen(“c:\\abc\\lx1.txt”,“r”);if(fp==NULL){printf("cannotopenthisfile\n");exit(0);}while((ch=fgetc(fp))!=EOF)putchar(ch);fclose(fp);}C语言程序设计例:复制一个文件的程序。(自己独立完成,再在班里讲解)处理流程:文件1变量文件2以只读方式打开文件1,以只写方式打开文件2;从文件1中读出数据到变量中,再将变量的值输出到文件2中,直到读到文件结束标志(EOF)。C语言程序设计二、文件的字符串读/写1.写字符串函数fputs()格式:fputs(字符串,文件指针变量);fputs函数的作用是将字符串写入文件指针所指向的文件中。其中字符串可以是字符常量,也可以是字符数组或指针变量。该函数调用成功时返回0,失败时返回EOF。如:fputs(“student”,fp);执行结果是将字符串“student”写入到fp所指向的文件中。#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(void){FILE*fp;charstring[81];if((fp=fopen(“f:\\C3exe\\file2.txt”,”w”))==NULL){printf(“can'topenfile”);exit(1);}while(strlen(gets(string))>0){fputs(string,fp);fputs(”\n“,fp);}fclose(fp);return0;}C语言程序设计2.读字符串函数fgets()

函数fgets用来从文件中读取一个字符串。格式:fgets(字符数组,n,文件指针变量)fgets函数的作用是从文件指针变量所指向的文件中读取n-1个字符至字符数组中。如果在读n-1个字符前遇到换行符或EOF标记,则读取结束。读出的字符放到字符数组中,然后在末尾加一个字符串结束标志“\0”。如果该函数调用成功,返回字符数组的首地址,失败时返回NULL。C语言程序设计#include<stdio.h>

#include<stdlib.h>

main()

{charch[50];/*定义一个字符数组*/

FILE*fp;/*定义一个文件类型的指针变量fp*/

fp=fopen("file.txt","r");/*打开文本文件file*/

if(fp==NULL)/*打开文件失败则退出*/

{printf(“cannotopenthisfile\n”);

exit(0);

}

fgets(ch,50,fp);/*读出文件中的字符串*/

printf("%s",ch);

fclose(fp);

}C语言程序设计三、文本文件格式化读写函数1.格式化写文件函数fprintf()

fprintf函数类似于printf函数,两者都是格式化输出函数,只不过两者的作用对象一个文件,一个是终端。fprintf函数的一般格式为:fprintf(文件指针,“格式控制”,输出列表)按指定的格式写数据到文本文件中。“格式控制”与“输出列表”同printf函数中描述。fprintf函数的作用是将输出项按指定的格式写入到文件指针变量所指向的文件中。如:fprintf(fp,“%d%d”,100,200);执行结果是将100和200两个整数存放到fp指向的文件中。注:用fprintf和fscanf函数对文件读写使用方便,容易理解,但由于在输入时要将ASCII码转换为二进制形式,在输出时又要将二进制形式转换成字符,花费时间较多,占用系统资源较大。因此在数据量较大的情况下,最好不用fprintf和fscanf函数,而用fread和fwrite函数。文件的格式化写#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(void){FILE*fp;charname[20];intnum;floatscore;if((fp=fopen(“f:\\C3exe\\file3.txt”,”w”))==NULL){printf(“can'topenfile”);exit(1);}printf(“Entername,num,score:”);scanf(“%s%d%f”,name,&num,&score);while(strlen(name)>1){fprintf(fp,“%s%d%f”,name,num,score);printf(“Entername,num,score:”);scanf(“%s%d%f”,name,&num,&score);}fclose(fp);return0;}C语言程序设计2.格式化读文件函数fscanf()

fscanf函数类似于scanf函数,两者都是格式化输入函数,不同的是scanf函数的作用对象是终端键盘,而fscanf函数的作用对象是文件。fscanf函数的一般格式为:fscanf(文件指针变量,“格式控制串”,输入列表)按指定的格式从文本文件中读入数据给变量。“格式控制”与“输入列表”同scanf函数中描述。

fscanf函数的作用是从文件指针变量指向的文件中按指定的格式读取数据到输入列表中的变量中。如:fscanf(fp,“%d,%d”,&x,&y);执行结果是从fp指向的文件中读取两个整数到变量x和y中。文件的格式化读#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp;charname[20];intnum;floatscore;if((fp=fopen(“f:\\c3exe\\file3.txt”,”r”))==NULL){printf(“can'topenfile”);exit(1);}while(fscanf(fp,“%s%d%f”,name,&num,&score)!=EOF)printf(“%-20s%6d%6.2f\n”,name,num,score);fclose(fp);return0;}C语言程序设计四、二进制文件的记录读/写1.读记录函数fread()

fread函数用来从指定文件读一个记录(或者结构体),例如读一个实数或一个结构体变量的值,格式:fread(buffer,size,count,文件指针变量)功能:fread函数的作用是从文件指针变量指向的文件中读count个长度为size的数据项到buffer所指的地址中。该函数如果调用成功返回实际读入记录的个数,如果读入数据块的个数小于要求的字节数,说明读到了文件尾或出错。参数:buffer——欲读入数据在内存中的存放地址,即指针。size——要读写的字节数(记录的长度)。count——要读写多少个size字节的数据项,即读写的记录数。fp——文件类型指针变量。C语言程序设计2.写记录函数fwrite()fwrite函数用来将一个记录写入文件,格式:fwrite(buffer,size,count,文件指针变量)fwrite函数的作用是从buffer(数据区首地址)所指的内存区写count个长度为size的数据项到文件指针变量指向的文件中。该函数如果调用成功返回实际写入文件中记录的个数,如果写入数据块的个数小于指定的字节数,说明函数调用失败。用fread和fwrite函数实行按“记录(或结构体)”读写,必须是二进制文件。C语言程序设计【例】从键盘输入三个学生的姓名、性别、年龄基本信息,存入文件student.stu中,然后再从文件中读出所输入的数据。#include<stdio.h>#include<stdlib.h>structstudent{charsname[8];

charssex;

intsage;}stu1[3],stu2[3];C语言程序设计voidmain(){inti;

FILE*fp;

fp=fopen(“student.dat”,“wb”);

if(fp==NULL)

{printf(“写文件打开失败!”);

exit(0);

}for(i=0;i<3;i++){printf(“请输入第%d个学生姓名、性别、年龄:”,i);gets(stu1[i].sname);scanf(“%c%d”,&stu1[i].ssex,&stu1[i].sage);getchar();}C语言程序设计fwrite(&stu1,sizeof(student),3,fp);fclose(fp);fp=fopen(“student.stu”,“rb”);fread(&stu2,sizeof(student),3,fp);printf(“您刚才输入的数据为:\n”);

for(i=0;i<3;i++)

{

printf(“%s%c%d\n”,stu2[i].sname,stu2[i].ssex,stu2[i].sage);

}

fclose(fp);}C语言程序设计第四节数据文件文件的随机读/写一、文件位置指针的定位文件中有一个读写位置指针,指向当前文件中读写操作的位置,刚打开一个文件时,位置指针位于文件的第一个字符处,每一次的读写操作完成后,位置指针都要指向下一个要读写的位置。C语言的文件既可以顺序存取,又可以随机存取。如果顺序读写一个文件,每次读写完一个数据后,该位置指针会自动移动到下一个数据的位置。如果想随机读写一个文件,那么就必须根据需要改变文件的位置指针,即用到文件定位函数。C语言程序设计1.随机定位函数fseek()

如果能将文件位置指针按需要移动到任意位置,就可以实现对文件的随机读写。

fseek(文件指针变量,位移量,参照点)

“位移量”是指以起始位置为基准点,文件位置指针移动的字节数,它要求必须为长整型数,当用常量表示位移量时要求加后缀“L”。“参照点”是位移量的基准点,它的取值可以是0、1或2。含义如下:C语言程序设计该函数如果调用成功返回0,否则返回非零值。如:fseek(fp,20L,0)功能:将文件位置指针定位到距文件头20个字节处。如:fseek(fp,50L,1)功能:文件位置指针文件从当前位置向文件尾方向移动到50个字节处。如:fseek(fp,-80L,2)执行结果是将文件位置指针从文件尾向文件头方向移动80个字节。fseek一般用于二进制文件,因为二进制文件中数据的表示与内存中的表示形式完全相同,同一类型数据占用确定的字节数,而文本文件不具有该特征。C语言程序设计文件中有三条记录,请读出其中的第二条。

#include“stdio.h“#include<stdlib.h>structstudent/*结构体定义*/{charsname[8];charssex[2];intsage;}stu;voidmain(){FILE*fp;/*定义文件指针变量*/fp=fopen("student.dat","rb");if(fp==NULL){printf("cannotopenthefilestudent.stu!");exit(0);

}C语言程序设计fseek(fp,sizeof(student),0);/*文件位置指针定位*/fread(&stu,sizeof(student),1,fp);/*读文件*/printf(“%s%s%d\n”,stu.sname,stu.ssex,stu.sage);fclose(fp);/*关闭文件*/}姓名1性别1年龄1姓名2性别2年龄2姓名3性别3年龄3文件内容文首第二条记录处C语言程序设计2.求当前读写位置函数ftell()读写文件时,文件位置指针的值经常发生变化,不容易知道其当前位置。但在程序设计过程中,明确文件当前的读写位置是很重要的。格式:ftell(文件指针变量)ftell函数用于求出位置指针相对于文件首的字节数,即其当前读写位置,为长整型。该函数调用失败返回-1L。C语言程序设计例:测文件的长度。#include<stdio.h>#include<stdlib.h>main(){FILE*fp;fp=fopen(“temp.dat","rb");if(fp==NULL){printf("cannotope

温馨提示

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

评论

0/150

提交评论