c语言课件(12)[下学期]

文档属性

名称 c语言课件(12)[下学期]
格式 rar
文件大小 131.1KB
资源类型 教案
版本资源 通用版
科目 信息技术(信息科技)
更新时间 2005-11-12 08:49:00

图片预览

文档简介

(共31张PPT)
文件操作
第十二章
回顾
上一节课主要讲解了以下内容
结构体
结构体数组
typedef关键字
冒泡排序法
插入排序法
目标
解释流和文件
讨论文本流和二进制流
解释各种文件函数
解释文件指针
讨论当前活动指针
文件输入/输出
C 语言的 I/O 操作使用标准库中的函数来实现
文件输入和输出的数据可以用内部的二进制表示法传输
文件输入和输出的数据也可以按文本格式传输

C 文件系统可以与各式各样的设备一起使用
缓冲文件系统可以将每个设备转换成逻辑设备,即所谓的流
由于所有的流工作方式类似
有两种类型的流
文本流
二进制流
文本流
文本流是一系列字符,可以由许多行构成,每行由一个换行符终止
在文本流中,可以根据情况需要对某些字符进行转换
写(或读)的字符与外部设备上的字符可能不是一对一的关系
同样,由于可能发生转换,写(或读)的字符数可能与外部设备上的字符数不同
二进制流
二进制流是一系列字节,并与外部设备上的字节一一对应
写(或读)的字节数与外部设备上的字节数一样
文件流是一系列独立的字节,没有任何标记用来指明文件的结束或记录的结束
文件的结束是由文件大小来决定的
文件
文件可以指任何设备,如磁盘文件、终端以及打印机
通过执行打开操作,文件可以与流进行关联;通过执行关闭操作,可以断开关联
如果一个程序正常终止,所有文件都会自动关闭
一旦程序崩溃,文件会保持打开状态
基本的文件函数
函数名 功能
fopen( ) 打开文件
fclose( ) 关闭文件
fputc( ) 将字符写入文件中
fgetc( ) 从文件中读取字符
fread() 将数据从文件中读到缓冲区
fwrite() 将数据从缓冲区写入文件
fseek( ) 在文件中搜索指定位置
fprintf( ) 操作类似于 printf(),但是用于文件
fscanf( ) 操作类似于 scanf(),但是用于文件
feof( ) 如果到达文件结尾,返回 true
ferror( ) 如果出错,返回 true
rewind( ) 将文件位置指示器重新置于文件开头
remove( ) 删除文件
fflush( ) 将内部缓冲区的数据写入指定文件
文件指针
文件指针是读写文件必需的
文件指针指向一个结构,该结构包含以下信息:文件名、文件的当前位置、文件是否正在读或写、是否出错或是否到达文件末尾
stdio.h 中定义了一个称为 FILE 的结构
文件指针所需的唯一声明为:
FILE *fp
打开文本文件
fopen() 函数打开一个流,并将其与一个文件关联起来
fopen() 函数返回与该文件关联的文件指针
fopen() 函数的原型为:
FILE *fopen(const char *filename, const char *mode);
模式 含义
r 打开文本文件进行读操作
w 创建文本文件进行写操作
a 向文本文件追加数据
r+ 打开文本文件进行读/写操作
w+ 创建文本文件进行读/写操作
a+f 追加或创建文本文件进行读/写操作
关闭文本文件
关闭文件可以释放系统资源,并且能降低超出允许打开的文件个数的风险
关闭流的同时也将清除所有相应的缓冲区
fclose() 函数关闭通过调用 fopen() 而打开的流
fclose() 函数的原型为:
int fclose(FILE *fp);
fcloseall() 函数用于关闭所有打开的流
向文本文件中写入字符
流可以逐个字符或将一个字符串写入文件中
fputc() 用于将字符写入前面由 fopen() 打开的文件
fputc()函数的原型为:
int fputc(int ch, FILE *fp);
从文本文件中读取字符
fgetc() 函数用于从使用 fgetc() 以读模式打开的文件中读取字符
fgetc() 函数的原型为:
int fgetc(int ch, FILE *fp);
fgetc() 函数从输入流中当前位置返回下一个字符,并增加文件位置指示器
字符串 l/O
函数 fputs() 用于向磁盘文件写入字符串,fgets() 用于从磁盘文件读取字符串
fputs() 函数将整个字符串写入指定的流中
fgets() 函数从指定的流中读取一个字符串,直到读到一个换行符或已经读了字符串长度减 1(length-1)个字符
其原型为:
int fputs(const char *str, FILE *fp);
char *fgets( char *str, int length, FILE *fp);
打开二进制文件
fopen() 函数打开一个流,并将其与一个文件关联起来
fopen() 函数返回与该文件关联的文件指针
fopen() 函数的原型为:
FILE *fopen(const char *filename, const char *mode);
模式 含义
rb 打开二进制文件进行读操作
wb 创建二进制文件进行写操作
ab 向二进制文件追加数据
r+b 打开二进制文件进行读/写操作
w+b 创建二进制文件进行读/写操作
a+b 追加二进制文件进行读/写操作
关闭二进制文件
fclose() 函数关闭通过调用 fopen() 而打开的流
fclose() 的原型为:
int fclose(FILE *fp);
fread() 和 fwrite()函数
函数 fread() 和 fwrite() 称为无格式读或写函数
它们用于从文件读取和向文件写入整块的数据
最有价值的一个应用就是读写用户定义的数据类型,尤其是结构
这两个函数的原型为:
size_t fread(void *buffer, size_t num_bytes, size_t count, FILE *fp);
size_t fwrite(const void *buffer, size_t num_bytes, size_t count, FILE *fp);
使用 feof()
如果到达文件末尾,函数 feof() 返回 true,否则将返回 false(0)
在读取二进制数据时使用该函数
其原型为:
int feof (FILE *fp);
rewind() 函数
rewind() 函数将文件位置指示器置于文件开头
它将文件指针作为自己的参数
语法:
rewind(fp );
ferror() 函数
ferror() 函数用以判断文件操作是否出错
由于每个操作都设置了出错条件,所以应在每个操作后立即调用 ferror() ,否则可能会遗漏错误
其原型为:
int ferror(FILE *fp);
删除文件
remove() 函数用于删除指定文件。
其原型为:
int remove(char *filename);
清除流
fflush() 函数根据文件类型清除缓冲区
如果打开文件进行读操作,该函数将清空文件的输入缓冲区;而打开文件进行写操作时;该函数将文件的输出缓冲区写入文件中
其原型为:
int fflush(FILE *fp);
如果 fflush() 函数的参数为空值,则清除所有被打开用于输出的文件
标准流
每当 C 程序在 DOS 下开始执行时,操作系统将自动打开 5 个专门的流
标准输入流 (stdin)
标准输出流 (stdout)
标准错误流 (stderr)
标准打印流 (stdprn)
标准辅助流 (stdaux)
当前活动指针
FILE 结构提供了一个指针,用以跟踪发生 I/O 操作的位置
每当从流中读取或写入一个字符,当前活动指针(即 curp)就会向前移动
当前活动指针的当前位置可以借助 ftell() 函数来获得
其原型为:
long int ftell(FILE *fp);
设置当前位置 2-1
fseek() 函数通过指定相对于开始位置、当前位置或流的末尾位置的字节数来重定位 curp,这取决于 fseek() 函数中指定的位置
其原型为:
int fseek (FILE *fp, long int offset, int origin);
设置当前位置 2-2
origin 表示搜索的起始位置,有以下几个值:
Origin 文件位置
SEEK_SET 或 0 文件开始
SEEK_CUR 或 1 当前文件指针的位置
SEEK_END 或 2 文件末尾
fprintf() 和 fscanf() 2-1
缓冲 I/O 系统还包括 fprintf() 和 fscanf() 函数。除了是对文件进行操作外,这些函数与 printf() 和 scanf() 类似
其原型为:
int fprintf(FILE * fp, const char *control_string,..) ;
int fscanf(FILE *fp, const char *control_string,...) ;
fprintf() 和 fscanf() 2-2
尽管 fprintf() 和 fscanf() 是最容易的方法,但它们的效率并不总是最高的
因为数据是以 ASCII 数据,而不是二进制格式写入的,因此调用这两个函数会产生额外开销
因此,就速度或文件大小而言,fread() 和 fwrite() 是较好的选择
总结
本课主要讲解了以下内容:
流和文件
文本流和二进制流
各种文件函数
文件指针
当前活动指针
同课章节目录