第十三讲文件 C文件概述 文件类型指针 文件的打开与关闭 文件的读写 ◆文件的定位 ⅴ出错的检测 非缓冲文件系统 文件输入输出小结
第十三讲 文件 C文件概述 文件类型指针 文件的打开与关闭 文件的读写 文件的定位 出错的检测 非缓冲文件系统 文件输入输出小结
C文件概述 文件(fle)-般指:存储在外部介质上数据的集合。数据是 以文件的形式存放在外部介质(如磁盘)上的,操作系统是 以文件为单位对数据进行管理的,也就是说,如果想找存在外 部介质上的数据,必须先按文件名找到所指定的文件然后再 从该文件中读取数据。要向外部介质上存储数据也必须先 建立一个文件(以文件名标识)才能向它输出数据 C语言把文件看作是一个字符(字节)的序列即由一个 字符(字节)的数据顺序组成根据数据的组织形成,可分为 ASCI文件和二进制文件。ASCI文件又称文本(ext)文件它 的每一个字节放一个ASCⅡ代码,代表一个字符二进制文件 是把内存中的数据按其在内存中的存储形式原样输出到磁 盘上存放
C文件概述 文件(file)一般指:存储在外部介质上数据的集合。数据是 以文件的形式存放在外部介质(如磁盘)上的,操作系统是 以文件为单位对数据进行管理的,也就是说,如果想找存在外 部介质上的数据,必须先按文件名找到所指定的文件,然后再 从该文件中读取数据。要向外部介质上存储数据也必须先 建立一个文件(以文件名标识),才能向它输出数据。 C语言把文件看作是一个字符(字节)的序列,即由一个一 个字符(字节)的数据顺序组成.根据数据的组织形成,可分为 ASCII文件和二进制文件。ASCII文件又称文本(text)文件,它 的每一个字节放一个ASCII代码,代表一个字符.二进制文件 是把内存中的数据按其在内存中的存储形式原样输出到磁 盘上存放
ASCI形式和二进制形式输出的不同 例:如果有一个整数10000在内存中占2个字节,如果按 ASCI形式输出,则占5个字节,而按二进制形式输出,在 磁盘上只占2个字节如下图所示 ASCI形式 0011000100110000001100000011000000110000 0010011100010000 二进制形式 0010011100010000 流 式 由前所述,一个C文件是一个字节流或二进制流。它把数 文据看作是连串的字符(字节而不考虑记录的界限,即C中 件文件并不是由记录eod组成的,在C中对文件的存取是 形餐程辟控制而不受物理符号控制,我们把这种文件称为流 式
ASCII形式和二进制形式输出的不同: 例: 如果有一个整数10000,在内存中占2个字节,如果按 ASCII形式输出,则占5个字节,而按二进制形式输出,在 磁盘上只占2个字节.如下图所示: 00100111 00010000 00100111 00010000 00110001 00110000 00110000 00110000 00110000 ASCII形式 (1) (0) (0) (0) (0) 二进制形式 由前所述,一个C文件是一个字节流或二进制流。它把数 据看作是一连串的字符(字节),而不考虑记录的界限,即C中 文件并不是由记录(record)组成的。在C中对文件的存取是 以字符(字节)为单位的,输入/输出数据流的开始和结束仅 受程序控制而不受物理符号控制,我们把这种文件称为流 式文件。 流 式 文 件 的 形 式:
文件的处理方法 日C版本有两种对文件的处理方法 缓冲文件系统 所谓缓冲文件系统是指,系统自动 地在内存区为每一个正在使用的文 输出文件缓冲区 件名开辟一个缓冲区。从内存向磁 数据程序区 输出 盘输出数据必须先送到内存中的缓 冲区,装满缓冲区后才一起送到磁 输出 磁盘)盘去;从磁盘向内存读入数据,也 输入文件缓冲区 输入 输入 是一次从磁盘文件将一批数据输入 到内存缓冲区,然后再从缓冲区逐 个地将数据送到程序数据区(给程 序变量)。缓冲区的大小由各个具 体的C版本确定,一般为512字节
文件的处理方法 旧C版本有两种对文件的处理方法: 一.缓冲文件系统: 数据程序区 输出文件缓冲区 输入文件缓冲区 输出 输入 输出 输入 磁盘 所谓缓冲文件系统是指,系统自动 地在内存区为每一个正在使用的文 件名开辟一个缓冲区。从内存向磁 盘输出数据必须先送到内存中的缓 冲区,装满缓冲区后才一起送到磁 盘去;从磁盘向内存读入数据,也 是一次从磁盘文件将一批数据输入 到内存缓冲区,然后再从缓冲区逐 个地将数据送到程序数据区(给程 序变量)。缓冲区的大小由各个具 体的C版本确定,一般为512字节
二非缓冲文件系统:所谓“非缓冲文件系统”是指系统 不 自动开辟确定大小的缓冲区, 而由程 序为每个文件设定缓冲区 在UNIX系统中,用缓冲文件系统来处理文本文件,用非 缓冲文件系统处理二进制文件。用缓冲文件系统进行的 输入/输出又称为高级输入/输出系统用非缓冲文件系统 进行的输入输出又称为低级输入/输出系统。TC只采用 缓冲文件系统,即既用缓冲文件系统处理文本文件,也用 它来处理二进制文件
二.非缓冲文件系统: 所谓“非缓冲文件系统”是指系统 不 自动开辟确定大小的缓冲区, 而由程 序为每个文件设定缓冲区。 在UNIX系统中,用缓冲文件系统来处理文本文件,用非 缓冲文件系统处理二进制文件。用缓冲文件系统进行的 输入/输出又称为高级输入/输出系统,用非缓冲文件系统 进行的输入输出又称为低级输入/输出系统。 TC只采用 缓冲文件系统,即既用缓冲文件系统处理文本文件,也用 它来处理二进制文件
文件类型指针 缓冲文件系统中,关键的概念是“文件指针”。每个被使用的 文件都在内存中开辟一个区域,用来存放文件的有关信息(如文件 的名字,文件状态及文件当前位置等)。这些信息是保存在一个结 构体类型变量中的,该结构体类型由系统定义取名为FILE 般的C中,在 stdio.h文件中有以下的类型定义: typedef struct dint fd /文件号* int cleft 缓冲区中剩下的字符 int modes /文件操作模式 char x nextc /下一个字符位置 char s buff: /文件缓冲区位置 3 FILE:
文件类型指针 缓冲文件系统中,关键的概念是“文件指针”。每个被使用的 文件都在内存中开辟一个区域,用来存放文件的有关信息(如文件 的名字,文件状态及文件当前位置等)。这些信息是保存在一个结 构体类型变量中的,该结构体类型由系统定义,取名为FILE。一 般的C中,在stdio.h文件中有以下的类型定义: typedef struct { int _fd; /*文件号*/ int _cleft; /*缓冲区中剩下的字符*/ int _mode; /*文件操作模式*/ char *_nextc; /*下一个字符位置*/ char *_buff; /*文件缓冲区位置*/ } FILE;
有了FIE类型之后,可以用它来定义若干FIE类型的变 量,以便存放若干个文件的信息。例如,可以定义文件型指 针变量如 FILE 出f 邱p是一个指向FIE类型结构体的指针变量,可以使印指向 个文件的结构体变量,从而通过该结构体变量中的文件信 息能够访问该文件,也就是说,通过文件指针变量能够找到 与它相关的文件。如果有n个文件,般应设n个指针(指向 FILE类型结构体的指针变量,使它们分别指向n个文件(确切 地说指向该文件的信息结构体),以实现对文件的访问
有了FILE类型之后,可以用它来定义若干FILE类型的变 量,以便存放若干个文件的信息。例如, 可以定义文件型指 针变量,如 FILE *fp; fp是一个指向FILE类型结构体的指针变量,可以使fp指向 一个文件的结构体变量,从而通过该结构体变量中的文件信 息能够访问该文件,也就是说,通过文件指针变量能够找到 与它相关的文件。如果有n个文件,一般应设n个指针(指向 FILE类型结构体的指针变量),使它们分别指向n个文件(确切 地说,指向该文件的信息结构体),以实现对文件的访问
文件的打开( (fopen函数) 与其它高级语言一样对文件读写之前应该“打开” 该文件,在使用结束之后应关闭该文件。 fopen函数的调用方式为: FILE *fp; fp= fopen(文件名使用文件方式) 例如 fp= fopen(“A1”,”r”) 它表示要打开名字为A1的文件使用文件方式为“读 入”,open函数带回指向A1文件的指针并赋给印,这样 邱就和A1相联系了,或者说fp指向A1文件
文件的打开(fopen函数) 与其它高级语言一样,对文件读写之前应该“打开” 该文件,在使用结束之后应关闭该文件。 fopen函数的调用方式为: FILE *fp; fp=fopen(文件名,使用文件方式); 例如: fp=fopen(“A1”,”r”) 它表示:要打开名字为A1的文件,使用文件方式为“读 入”,fopen函数带回指向A1文件的指针并赋给fp,这样 fp就和A1相联系了,或者说,fp指向A1文件
可以看出,在打开一个文件时通知给编译系统以下三 个信息 (1)需要打开的文件名,也就是准备访问的文件的 名字。 (2)使用文件的方式(读还是写等)。 (3)让哪一个指针变量指向被打开的文件
可以看出,在打开一个文件时,通知给编译系统以下三 个信息: (1)需要打开的文件名,也就是准备访问的文件的 名字。 (2) 使用文件的方式(读还是写等)。 (3) 让哪一个指针变量指向被打开的文件
使用文件方式如下表: 文件使用方式 含义 “r”(只读) 为输入打开一个文本文件 (只写) 为输出打开一个文本文件 (追加 向文本文件尾增加数据 “rb”(只读) 为输入打开一个二进制文件 “wb(只写) 为输出打开一个二进制文件 ab”(追加) 向二进制文件尾增加数据 “r+”(读写) 为读/写打开一个文本文件 “w+”(读写) 为读/写建立一个新的文本文件 “a+”(读写) 为读/写打开一个文本文件 rb+”(读写) 为读/写打开一个二进制文件 “wb+”(读写 为读/写建立一个新的二进制文件 “ab+”(读写) 为读/写打开一个二进制文件
文件使用方式 含义 “r” (只读) 为输入打开一个文本文件 “w” (只写) 为输出打开一个文本文件 “a” (追加) 向文本文件尾增加数据 “rb” (只读) 为输入打开一个二进制文件 “wb” (只写) 为输出打开一个二进制文件 “ab” (追加) 向二进制文件尾增加数据 “r+” (读写) 为读/写打开一个文本文件 “w+” (读写) 为读/写建立一个新的文本文件 “a+” (读写) 为读/写打开一个文本文件 “rb+” (读写) 为读/写打开一个二进制文件 “wb+” (读写) 为读/写建立一个新的二进制文件 “ab+” (读写) 为读/写打开一个二进制文件 使用文件方式如下表: