第十三章文件 ■131文件概述 133文件的打开与关闭 134文件的顺序读写 135文件的定位与随机读写
第十三章 文件 ◼ 13.1 文件概述 ◼ 13.3 文件的打开与关闭 ◼ 13.4 文件的顺序读写 ◼ 13.5 文件的定位与随机读写
131文件概述 文件的概念 1.文件:指存储在外部介质上的数据的集合 操作系统是以文件为单位对数据进行管理的如果想 使用存在外部介质上的数据,必须先按文件名找到指定的 文件然后再从文件中读取数据;如果要向外部介质上存储 数据,也必须先建立一个文件,再向它输出数据 文件除了包括磁盘上存储的内容外,从操作系统的角度 看与主机相连的各种输入输出设备也是文件.例如,键盘是 输入文件,显示器是输出文件 2.文件的分类 C语言把文件看作是一个字节的序列,即文件是由一个 个字节的数据顺序组成的根据数据的组织形式把文件 分为两类:文本文件和二进制文件
13.1 文件概述 一、 文件的概念 1. 文件: 指存储在外部介质上的数据的集合 操作系统是以文件为单位对数据进行管理的. 如果想 使用存在外部介质上的数据,必须先按文件名找到指定的 文件,然后再从文件中读取数据; 如果要向外部介质上存储 数据, 也必须先建立一个文件, 再向它输出数据. 文件除了包括磁盘上存储的内容外, 从操作系统的角度 看与主机相连的各种输入输出设备也是文件. 例如, 键盘是 输入文件, 显示器是输出文件. 2. 文件的分类 C语言把文件看作是一个字节的序列, 即文件是由一个 一个字节的数据顺序组成的. 根据数据的组织形式把文件 分为两类: 文本文件和二进制文件
(1)文本文件(也称ASCI文件) 文件的每一个字节存放一个ASCI码,代表一个字符 其优点是便于对字符进行处理,缺点是占用存储空间 较多,二进制形式与ASCI码形式转换需要时间 (2)二进制文件 把内存中的数据按其在在内存中的存储形式原样输出 到磁盘上存放其优点是节省空间,输入输出速度快; 缺点是不能直接输出字符形式 设内存有一整数2460,内存中的存储形式: 即十进制数2460所对应的二进制数形式000100110011100 2460在文本文件中的存储形式(非压缩的BCD码): 即每位十进制数占8为二进制数前4位为填充位,后4为十进制数值所对 应的二进制形式 0011001000110100001101100110000 2460在二进制文件中的存储形式:00000110
(1) 文本文件(也称ASCII文件) 文件的每一个字节存放一个ASCII码, 代表一个字符. 其优点是便于对字符进行处理, 缺点是占用存储空间 较多, 二进制形式与ASCII码形式转换需要时间 (2) 二进制文件 把内存中的数据按其在在内存中的存储形式原样输出 到磁盘上存放. 其优点是节省空间, 输入输出速度快; 缺点是不能直接输出字符形式 设内存有一整数2460, 内存中的存储形式: 即十进制数2460所对应的二进制数形式 0000 1001 1001 1100 2460在文本文件中的存储形式(非压缩的BCD码): 即每位十进制数占8为二进制数前4位为填充位,后4为十进制数值所对 应的二进制形式。 0011 0010 0011 0100 0011 0110 0011 0000 2460在二进制文件中的存储形式: 0000 1001 1001 1100
磁盘文件系统 1.磁盘文件系统对文件的处理方法 从磁盘文件输入数据时(即读文件)先将数据送到“输入 冲区”,再从缓冲区将数据传送给程序数据区(即传给程 中的变量);向磁盘文件输出数据时即写文件),先将程序中 变量的值送到“输出缓冲区”,等缓冲区装满后再将数据 起传送给磁盘文件.使用缓冲区的目的是为了减少对磁盘 的定际读写次数 写文件 磁盘文件—输出缓冲区—程序数据区 2.磁盘文件系统的分类 (1)缓冲文件系统:系统自动的在内存区为每一个正在使用 的文件开辟一个缓冲区.缓冲区的大小由具体的C版本 确定,一般为512字节 (2)非缓冲文件系统:系统不是自动开辟确定大小的缓冲区, 由程序为每个文件设定缓冲区及其大小(即缓冲区由用 户根据需要自己进行设置)
二、 磁盘文件系统 1. 磁盘文件系统对文件的处理方法 从磁盘文件输入数据时(即读文件), 先将数据送到“输入 缓冲区”, 再从缓冲区将数据传送给程序数据区(即传给程 序 中的变量) ; 向磁盘文件输出数据时(即写文件), 先将程序中 变量的值送到“输出缓冲区”, 等缓冲区装满后再将数据一 起传送给磁盘文件. 使用缓冲区的目的是为了减少对磁盘 的实际读写次数 2. 磁盘文件系统的分类 (1) 缓冲文件系统: 系统自动的在内存区为每一个正在使用 的文件开辟一个缓冲区. 缓冲区的大小由具体的C版本 确定, 一般为512字节. (2) 非缓冲文件系统: 系统不是自动开辟确定大小的缓冲区, 由程序为每个文件设定缓冲区及其大小(即缓冲区由用 户根据需要自己进行设置) . 读文件 写 磁盘文件 输入缓冲区出 程序数据区
三、文件类型指针 要使用一个文件需要有一定的信息,如文件当前的读 写位置,与文件对应的内存缓冲区地址,文件的操作方式等 菜些信息都存放在“文件信息区”中,“文件信息区”是一 结构体变量,其结构体类型由系统定义,类型名为FIE 定义形式:FE*指针变量名; 注意: 1.只有通过文件指针变量才能调用相应的文件 2.有n个文件就要定义n个文件指针变量,分别对应各个 文件 3.FLLE必须大写
三、 文件类型指针 要使用一个文件需要有一定的信息, 如文件当前的读 写位置, 与文件对应的内存缓冲区地址, 文件的操作方式等. 这些信息都存放在“文件信息区”中 , “文件信息区”是一 个 结构体变量, 其结构体类型由系统定义, 类型名为FILE 定义形式: FILE * 指针变量名; 注意: 1. 只有通过文件指针变量才能调用相应的文件 2. 有n个文件就要定义n个文件指针变量, 分别对应各个 文件 3. FILE必须大写
133文件的打开与关闭 文件的打开 1. fopen函数 格式: fopen(文件名,文件使用方式); fopen函数有返回值,返回值是一个地址,即被打开文件 的“文件信息区”的起始地址,使用时应将返回值赋给 文件指针变量 需要打开的文件名 例FLLE*fp; fp= fopen(“file1”,“ 使用文件的方式(读或写) 让哪个指针变量指向被打开的文件
13.3 文件的打开与关闭 一、 文件的打开 1. fopen函数 格式: fopen ( 文件名 , 文件使用方式 ) ; fopen函数有返回值, 返回值是一个地址, 即被打开文件 的“文件信息区”的起始地址 , 使用时应将返回值赋给一 个 文件指针变量 需要打开的文件名 使用文件的方式(读或写) 让哪个指针变量指向被打开的文件 例 FILE *fp ; fp = fopen ( “file1” , “r” ) ;
2.文件使用方式(见课本P333表13-1) (1)“r”(文本文件)与“rb”(二进制文件)只读 以此方式打开文件时,该文件必须已经存在,如不存在将 出错.打开文件后只能从文件中读数据,当前读写位置设定 于文件开头 (2)“w”(文本文件)与“wb”(二进制文件)只写 以此方式打开文件时,如有同名文件(即文件已存在,则将 原有文件删除并建立一个新文件;如没有同名文件(即文件不 存在),则建立一个新文件.打开文件后只能向文件中写数据 当前读写位置设定于文件开头 (3)“a”(文本文件)与“ab”(二进制文件)追加 以此方式打开文件时,如有同名文件,则将当前读写位置 设定于文件末尾,可以追加数据;如无同名文件,则建立一个 新文件 ■(4)带“+”号的形式:表示即能读又读写
2. 文件使用方式(见课本P333 表13-1) (1) “r”(文本文件)与“rb”(二进制文件) 只读 以此方式打开文件时, 该文件必须已经存在, 如不存在将 出错. 打开文件后只能从文件中读数据, 当前读写位置设定 于文件开头. (2) “w” (文本文件)与“wb” (二进制文件)只写 以此方式打开文件时, 如有同名文件(即文件已存在), 则将 原有文件删除并建立一个新文件; 如没有同名文件(即文件不 存在), 则建立一 个新文件. 打开文件后只能向文件中写数据, 当前读写位置设定于文件开头. (3) “a” (文本文件)与“ab” (二进制文件) 追加 以此方式打开文件时, 如有同名文件, 则将当前读写位置 设定于文件末尾, 可以追加数据; 如无同名文件, 则建立一个 新文件 (4) 带“+”号的形式: 表示即能读又读写
3打开文件的方法 打开文件时,因使用方式不对或其他原因,可能会使打开 文件的操作失败,这时 fopen函数的返回值是NULL,所以在 打开文件时通常我们会做一个判断,看打开操作是否成功 例if(fp= fopen(“file1”,“r”))==NULL) i printf(Can not open this file!n); exit(0); 说明:exit函数的作用是关闭所有文件,结束程序,并返回 操作系统,也可写成ext(); 注意:使用exit函数要包含头文件
3. 打开文件的方法 打开文件时, 因使用方式不对或其他原因, 可能会使打开 文件的操作失败, 这时fopen函数的返回值是NULL, 所以在 打开文件时通常我们会做一个判断, 看打开操作是否成功. 例 if ( ( fp =fopen(“file1”, “r”) ) = = NULL ) { printf(“Can not open this file!\n”) ; exit( 0 ) ; } 说明: exit 函数的作用是关闭所有文件, 结束程序, 并返回 操作系统, 也可写成exit ( ) ; 注意: 使用exit函数要包含头文件
文件的关闭 1. fclose函数 格式: fclose(文件指针变量); 例: fclose((fp) 作用:将文件指针变量所指向的文件关闭,即使文件指针 变量不再指向该文件,以后不能通过文件指针变量 对该文件进行操作 说明: fclose函数的返回值为整型,若关闭成功返回值为0, 若失败返回值为非零数 2.关闭文件的重要性 件 写文件时,在“输出缓冲区”装满后,才将数据一起写入文 当程序结束时,缓冲区可能还未满,如未关闭文件就结束程序, 则缓冲区的数据不能写入文件,会丢失数据使用fose函数, 不论缓冲区是否已满,都会将缓冲区的数据写入文件,再关闭 文件
二、 文件的关闭 1. fclose函数 格式: fclose ( 文件指针变量) ; 例: fclose( fp ) ; 作用: 将文件指针变量所指向的文件关闭, 即使文件指针 变量不再指向该文件,以后不能通过文件指针变量 对该文件进行操作 说明: fclose函数的返回值为整型, 若关闭成功返回值为0 , 若失败返回值为非零数 2. 关闭文件的重要性 写文件时, 在“输出缓冲区”装满后, 才将数据一起写入文 件. 当程序结束时, 缓冲区可能还未满, 如未关闭文件就结束程序, 则缓冲区的数据不能写入文件, 会丢失数据. 使用fclose函数, 不论缓冲区是否已满, 都会将缓冲区的数据写入文件, 再关闭 文件
134文件的顺序读写 输入/输出一个字符 1. fputc函数(向文件输出一个字符) 格式: fputc(字符常量或字符变量,文件指针变量); 作用:将一个字符写到文件指针所指向的文件中去 函数返回值:成功时返回该字符,失败时返回EOF 例: FILE *fp; char ch if((fp= fopen(“ filel”,“w”)==NULL) i printf(Can not open this file! n): exit(0);) 按只写方式打开文件fe1.c,若打开失败则结束程序 fputc(s', fp ch= getchar(; 将字符‘s写入fp指向的文件fiel fputc(ch, fp) 将字符变量ch中存放的字符 写入fp指向的文件fe1中
13.4 文件的顺序读写 一、 输入/输出一个字符 1. fputc函数(向文件输出一个字符) 格式 : fputc ( 字符常量或字符变量, 文件指针变量) ; 作用 : 将一个字符写到文件指针所指向的文件中去 函数返回值: 成功时返回该字符, 失败时返回 EOF 例: FILE *fp ; char ch ; if ( ( fp =fopen(“file1”, “w”) ) = = NULL ) { printf(“Can not open this file!\n”) ; exit( 0 ) ; } /*按只写方式打开文件file1.c,若打开失败则结束程序*/ fputc( ‘s’ , fp ) ; ch = getchar( ) ; fputc( ch , fp ) ; 将字符‘s’写入fp指向的文件file1 中 将字符变量ch中存放的字符 写入fp指向的文件file1中