本章导读文件是程序设计中极为重要的一个概念,文件一般指存储在外部介质上的数据的集合。通过文件可以大批量处理数据,可以长时间的将信息存储起来。本章通过文件操作实例分析着手,使读者首先对文件的操作过程有一个初步的了解,明白文件操作的重要性,进而再深入的学习C语言有关文件的操作。《C语言程序设计》(VisualC++6.0环境)返回本书目录第9章文件本章主要知识点(1)文件操作的C程序实例(2)文件的打开与关闭(3)文件的读写和定位(4)文件出错的检测第9章文件《C语言程序设计》(VisualC++6.0环境)返回本章导读9.2文件的打开与关闭9.3文件的读写9.5文件出错的检测9.4文件的定位9.1文件操作的C程序实例9.6综合实训《C语言程序设计》(VisualC++6.0环境)返回本章目录9.1.2C文件概述9.1.3文件类型指针9.1.1文件操作的C程序实例9.1文件操作的C程序实例9.1.1文件操作的C程序实例《C语言程序设计》(VisualC++6.0环境)返回本节目录1.C程序实例(1)2.C程序实例(2)3.C程序实例(3)9.1.1文件操作的C程序实例《C语言程序设计》(VisualC++6.0环境)返回本节目录1.C程序实例1【例9.1】读出文件file.txt中的字符。程序文件名为l9_1.cpp。1)#includestdio.h#includestdlib.hvoidmain(){charch;/*定义一个字符变量ch*/FILE*fp;/*定义一个文件类型的指针变量fp*/fp=fopen(file.txt,r);/*打开文本文件file*/if(fp==NULL)/*打开文件失败*/{printf(cannotopenthisfile\n);exit(0);}9.1.1文件操作的C程序实例《C语言程序设计》(VisualC++6.0环境)返回本节目录ch=fgetc(fp);/*读出文件中的字符并赋予变量ch*/while(ch!=EOF)/*判断文件是否结束*/{putchar(ch);/*输出从文件中读出的字符*/ch=fgetc(fp);/*读出文件中的字符并赋予变量ch*/}fclose(fp);/*关闭文件*/}建立文本文件,在文件中输入一些文字,保存文件名为file,然后与程序文件放在同一目录下。如右图所示:9.1.1文件操作的C程序实例《C语言程序设计》(VisualC++6.0环境)返回本节目录程序执行结果为:从文件file中读出的文字9.1.1文件操作的C程序实例《C语言程序设计》(VisualC++6.0环境)返回本节目录【例9.2】将用户从键盘输入的用户名和密码写到文件user.x中。程序文件名为l9_2.cpp。#includestdio.h#includestdlib.hstructuserinfo/*定义结构体*/{charusername[10];charpassword[12];}stu;voidmain(){FILE*fp;/*定义文件指针fp*/fp=fopen(user.x,wb);/*以二进制方式打开文件user.x*/if(fp==NULL)/*打开文件失败*/2.C程序实例2{printf(cannotopenthisfile\n);exit(0);}printf(Pleaseinputyourusername:);scanf(%s,&stu.username);printf(\nPleaseinputyourpassword:);scanf(%s,&stu.password);fwrite(&stu,sizeof(userinfo),1,fp);/*将用户输入的信息写入文件*/fclose(fp);/*关闭文件*/}例如用户根据提示信息输入如下:Pleaseinputyourusername:studentPleaseinputyourpassword:12345678则执行结果为先在程序文件的目录下建立文件user.x,然后将字符串“student”和“12345678”写入该文件。9.1.1文件操作的C程序实例《C语言程序设计》(VisualC++6.0环境)返回本节目录【例9.3】从文件user.x中读取用户名和密码。程序文件名为l9_3.cpp。#includestdio.h#includestdlib.hstructuserinfo/*定义结构体*/{charusername[10];charpassword[12];}stu;9.1.1文件操作的C程序实例《C语言程序设计》(VisualC++6.0环境)返回本节目录3.C程序实例3voidmain(){FILE*fp;/*定义文件类型指针fp*/fp=fopen(“user.x”,“rb”);/*以二进制只读方式打开文件user.x*/if(fp==NULL){printf(cannotopenthisfile\n);exit(0);}fread(&stu,sizeof(userinfo),1,fp);/*读出文件中的数据*/printf(yourusername:%s\n,stu.username);printf(yourpassword:%s\n,stu.password);fclose(fp);/*关闭文件*/}9.1.1文件操作的C程序实例《C语言程序设计》(VisualC++6.0环境)返回本节目录假如user.x中的数据是实例2所输入的信息,则输出结果为:yourusername:studentyourpassword:123456789.1.2C文件概述《C语言程序设计》(VisualC++6.0环境)返回本节目录C语言把磁盘文件看作是字符(或字节)的序列,根据数据的组织形式(存储信息的形式),文件可分为ASCⅡ码文件和二进制文件。ASCⅡ码文件又称为文本文件,该文件是由一个个字符组成,每一个字节存放一个ASCⅡ码,代表一个字符。二进制文件是把内存中的数据按其在内存中的存储形式原样放入磁盘存放。例如,现有一个整数1234,如果按ASCⅡ码形式存入文件,要占4个字节,其存储形式如下:9.1.2C文件概述《C语言程序设计》(VisualC++6.0环境)返回本节目录如果按二进制形式存入文件,则只占2个字节,其存储形式与内存中的存储形式相同,如下:0000010011010010由以上举例不难看出用ASCⅡ码形式存入文件时一个字节代表一个字符,因而便于对字符进行逐个处理,也便于输出,但一般占存储空间较大,而且要花费二进制形式与ASCⅡ码之间的转换时间。用二进制形式存入文件则可以节省外存空间和转换时间,但一个字节并不对应一个字符,所以如果在屏幕上显示经常显示的是乱码。9.1.3文件类型指针《C语言程序设计》(VisualC++6.0环境)返回本节目录C语言程序可以同时处理多个文件,为了对每一个文件进行有效的管理,在打开一个文件时,系统会自动地在内存中开辟一个区,用来存放文件的有关信息(如文件名、文件状态等)。这些信息保存在一个结构体变量中,该结构体是由系统定义的,取名为FILE。FILE定义在头文件stdio.h中。对每一个要进行操作的文件,都需要定义一个指向FILE类型结构体的指针变量,该指针称为文件类型指针,文件类型指针的定义方法如下:FILE*指针变量;如:FILE*fp;fp是一个指向FILE类型结构体的指针变量。当fp和某个文件建立关联之后,通过fp即可找到存放该文件信息的结构变量,然后按结构变量提供的信息找到该文件,实施对文件的操作。《C语言程序设计》(VisualC++6.0环境)返回本章目录9.2.2文件关闭函数fclose()9.2.1文件打开函数fopen()9.2文件的打开与关闭9.2.1文件打开函数fopen()《C语言程序设计》(VisualC++6.0环境)返回本节目录在使用一个文件之前,必须先打开它,然后才能对它进行读写操作,从9.1.1的C程序实例我们也能看出,每个程序都用到了fopen函数,该函数的功能就是用来打开一个文件。函数fopen的使用格式为:FILE*文件指针变量;文件指针变量=fopen(“文件名”,“文件使用方式”);fopen函数的作用是以指定的方式打开指定文件。如果文件打开成功,返回一个文件类型指针,如果文件打开失败,则返回一个空指针NULL。“文件名”指要打开文件的名称。“文件使用方式”指文件的类型和操作要求。如下表所示:9.2.1文件打开函数fopen()《C语言程序设计》(VisualC++6.0环境)返回本节目录9.2.1文件打开函数fopen()《C语言程序设计》(VisualC++6.0环境)返回本节目录由于文件是独立于程序之外不易被控制的,所以调用文件是程序中最易出错的地方。打开文件也是如此,当打开文件出错时,函数fopen会返回一个空指针NULL,出错原因可能是以“r”方式打开一个不存在的文件,或者是磁盘已满等。一旦文件打开出错,后边的程序也将无法执行,好的习惯是先检查打开文件时是否出错,如果有错则提示给用户,并终止程序的执行,等用户检查出错误,修改后再运行该程序。所以通常打开文件的方法是:FILE*文件指针变量;文件指针变量=fopen(“文件名”,“文件使用方式”);If(文件指针变量==NULL){printf(“cannotopenthisfile\n”);exit(0);}9.2.2文件关闭函数fclose()《C语言程序设计》(VisualC++6.0环境)返回本节目录在使用完一个文件后应该即时关闭它,这是一个程序设计者应养成的良好习惯。如果使用完没有关闭文件,则不仅占用系统资源,还可能造成文件被破坏。关闭文件的函数是fclose(),其使用方法为:fclose(文件指针变量);fclose用来关闭文件指针变量所指向的文件。该函数如果调用成功,返回数值0,否则返回一个非零值。如:fclose(fp);关闭文件后,文件类型指针变量将不再指向和它所关联的文件,此后不能再通过该指针对原来与其关联的文件进行读写操作,除非再次打开该文件,使该指针变量重新指向该文件。《C语言程序设计》(VisualC++6.0环境)返回本章目录9.3.2字符串读写函数9.3.1单个字符读写函数9.3文件的读写9.3.4格式化读写函数9.3.3数据块读写函数9.3.5整数读写函数9.3.1单个字符读写函数《C语言程序设计》(VisualC++6.0环境)返回本节目录1.读字符函数fgetc()该函数的使用方法为:字符变量=fgetc(文件指针变量);函数fgetc的作用是从文件指针变量指向的文件中读取一个字符。该函数如果调用成功,返回读出的字符,文件结束或出错时返回EOF(-1)如:ch=fgetc(fp);其中,ch是字符变量,fp为文件指针变量,fgetc函数将从fp指向的文件中读出一个字符并赋给变量ch。在fgetc()函数调用中,读取的文件必须是以读或读写方式打开。9.3.1单个字符读写函数《C语言程序设计》(VisualC++6.0环境)返回本节目录2.写字符函数fputc()该函数的一般格式为:fputc(ch,文件指针变量);fputc函数的作用是将ch所对应的一个字符写入到文件指针变量所指向的文件中去。ch是要写入到文件中的字符,它可以是一个字符常量,也可以是一个字符变量。如果函数调用成功返回所写字符的ASCII码值,出错时返回EOF。如:fputc(“a”,fp);其执行结果是将字符a写入到fp所指向的文件中。9.3.2字符串读写函数《C语言程序设计》(VisualC++6.0环境)返回本节目录1.读字符串函数fgets()函数fgetc每次只能从文件中读取一个字符,而函数fgets则用来读取一个字符串。该函数的一般格式为:fgets(字符数组,n,文件指针变量)fgets函数的作用是从文件指针变量所指向的文件中读取n-1个字符。如果在读n-1个字符前遇到换行符或EOF标记,则读取结束。读出的