Presentation is loading. Please wait.

Presentation is loading. Please wait.

C语言程序设计 第13章 文件操作.

Similar presentations


Presentation on theme: "C语言程序设计 第13章 文件操作."— Presentation transcript:

1 C语言程序设计 第13章 文件操作

2 本章学习内容  二进制文件和文本文件  文件的打开和关闭  文件的顺序读写与随机读写  标准输入输出及其重定向

3 Von J. Neumann Architecture
记忆装置(Memory) Where to put data in computer? How to input or output data? 输入/输出 设备 存储器 运算器 控制器 程序 和输入数据 输出结果 取出数据 存入数据 操作命令 存取命令 取出 程序指令 输入输出命令 计算结果 CPU 眼睛和耳朵(I/O devices) 大脑

4 I/O设备 输入设备 输出设备 单纯的输入设备或者单纯的输出设备越来越少 键盘、鼠标 软盘、硬盘、光驱(以文件的形式)
扫描仪、视频采集卡、电视卡、游戏杆、话筒 …… 输出设备 显示器、打印机 软盘、硬盘、 CD/DVD-RW (以文件的形式) 音箱 单纯的输入设备或者单纯的输出设备越来越少 键盘上的指示灯其实是计算机的输出。鼠标也开始有反馈功能了。显示器出现了触摸屏……

5 标准输入/输出 字符界面的操作系统一般都提供标准输入与输出设备 一般情况,标准输入就是键盘,标准输出就是终端显示器
DOS、Linux、UNIX… 一般情况,标准输入就是键盘,标准输出就是终端显示器 操作系统有能力重定向标准输入与输出,比如让文件作为标准输入(标准输出) 这种重定向程序本身是感觉不到的 自来水厂

6 DOS下的标准输入/输出重定向 程序prog如下 输入重定向 输出重定向
main() { char c; while ((c=getchar()) != '\n') putchar(++c); } 输入重定向 prog < infile.txt 输出重定向 prog > outfile.txt

7 流(Stream) 计算机中的流的概念 流的载体? 一般称为数据流,也叫做字节流、比特流 可以倒流的数据流 不会倒流的数据流也很多
File stream(文件流), Video stream(视频流) and Audio stream(音频流)in specific field. 可以倒流的数据流 如果你想重新读已经读过的数据,或者要修改已经写入的数据,可以发出流控(Flow Control)命令 不会倒流的数据流也很多 网络上的数据流。网络和数据线等介质只有很小的数据缓冲区,没有大量存储的能力 流的载体? 磁盘文件、终端显示器或打印机、存储器等

8 外存 内存容易健忘,所以数据必须保存在“不健忘”的外存上 容量大、断电后数据不丢失,可重复使用,永久保存
磁盘(Magnetic Disks) 光盘(CD、DVD) U盘(Flash Memory)...... 容量大、断电后数据不丢失,可重复使用,永久保存 一般都以文件的形式给用户及应用程序使用

9 文件(File) 文件 程序中的文件 一般指存储在外部介质上有名字的一组相关数据的集合 用文件可长期保存数据,实现数据共享
在C语言中,文件可泛指磁盘文件、终端显示器或打印机…… 程序中的文件 在程序运行时由程序在磁盘上建立一个文件,通过写操作将数据存入该文件 由程序打开磁盘上的某个已有文件,并通过读操作将文件中的数据读入内存供程序使用

10 文件(Files)与流 (Streams)
程序通过文件打开操作把流与设备联系起来,文件打开后,可在程序和文件之间交换数据 程序通过文件关闭操作断开流与文件的联系 所有流的性质都一样 因为流与设备无关,所以能写入磁盘文件的同一函数也能写入另一设备,如控制台终端等 文件的能力则不同 如磁盘文件支持随机存取,而键盘则不能

11 文件的存放(Storage) 可以建立若干文件目录(directory\folder文件夹)
在目录里保存文件 同一级目录里保存的文件不能同名 对使用者而言,只要知道文件的路径(path, 全目录)和文件名,就能使用该文件 C:\home\Sunner\main.c 这都是托OS的福

12 13.1二进制文件和文本文件 文件的类型(Type of Files)? 二进制文件 是一种字节序列,没有字符变换
按照数据在内存中的存储形式(二进制)存储到文件 如整数123,在内存占2个字节,则文件中也占2个字节 文本文件/ASCII码文件 是一种字符序列,文件中存储每个字符的ASCII码 如整数123在文件中占3个字节,分别存放这3个字符的ASCII码 如果存1234呢?

13 文件的格式(Format of Files)
数据必须按照存入的类型读出,才能恢复其本来面貌 公开的标准格式 如bmp、tif、gif、jpg和mp3等类型的文件,有大量软件能生成和使用这些类型的文件 不公开或加密的文件格式 如Microsoft Word的doc格式就不公开,所以至今没有Word以外的其他软件能完美地读出doc文件

14 缓冲型和非缓冲型文件系统 缓冲型文件系统 非缓冲型文件系统
指系统自动在内存中为每一个正在使用的文件开辟一个缓冲区,在读写文件时,数据先送到缓冲区,再传给C程序或外存上 缓冲文型件系统利用文件指针标识文件 缓冲型文件系统中的文件操作,也称高级文件操作 高级文件操作函数是ANSI C定义的文件操作函数,具有跨平台和可移植的能力 非缓冲型文件系统 不会自动设置文件缓冲区,缓冲区需由程序员自己设定 非缓冲型文件系统没有文件指针,它使用称为文件号的整数来标识文件

15 13.2文件的打开和关闭 下面介绍的函数均定义在<stdio.h>中
FILE *fopen(const char *filename, const char *mode); FILE *fp = fopen("C:\\CONFIG.SYS", "rw"); filename是文件名 包含路径。如果不含路径,表示打开当前目录下的文件 mode是打开方式 常用为"r"、"w"、"rw"和"a",分别表示只读、只写、读写和添加 "rb"表示只读二进制文件 返回值为指向此文件的指针,留待以后使用 如果打开失败,返回值为NULL

16 文件打开方式(mode): 对应文本文件 “r” 只读 必须是已存在的文件 “w” 只写 不论该文件是否存在,都新建一个文件
“a” 追加 向文本文件尾增加数据,该文件必须存在 “r+” 读写 打开一个已存在的文件,用于读写 “w+” 读写 建立一个新文件,可读可写 “a+” 读写 向文件尾追加数据,也可读 “rb” “wb” “ab” “rb+” “wb+” “ab+” 对应二进制文件

17 文件指针(File Pointer) FILE *fp ; 是FILE型指针变量,标识一个特定的磁盘文件
typedef struct { short level; /*缓冲区‘满’或‘空’的程度*/ unsigned flags; /*文件状态标志*/ char fd; /*文件描述符*/ unsigned char hold; /*如无缓冲区不读字符*/ short bsize; /*缓冲区的大小*/ unsigned char *buffer;/*数据缓冲区的位置*/ unsigned char *curp; /*指针当前的指向*/ unsigned istemp; /*临时文件指示器*/ short token; /*用于有效性检查*/ }FILE; /*在stdio.h文件中定义*/

18 13.2文件的打开和关闭 int fclose(FILE *fp); fclose函数的返回值
把遗留在缓冲区中的数据写入文件,实施操作系统级的关闭操作 同时,释放与流联系的文件控制块,以后可以重复使用这部分空间 多数情况下,系统限制同时处于打开状态的文件总数,因此,打开文件前先关闭无用文件是必要的 fclose函数的返回值 当顺利地执行了关闭操作,返回值为0 如果返回值为非零值,表示关闭时有错误 一般只有驱动器中无盘或盘空间不够时才失败,关闭失败会引起数据丢失、文件的破坏和程序中的随机错误

19 13.3按字符读写文件 字符读写 int fgetc(FILE *fp); 从fp读出一个字符,将位置指针指向下一个字符
若读成功,则返回该字符,若读到文件尾,则返回EOF(EOF是一个符号常量,在stdio.h中定义为-1) int fputc(int c, FILE *fp); 向fp输出字符c 若写入错误,则返回EOF,否则返回c

20 13.3按字符读写文件 【例13.1】从键盘输入一串字符,转存到磁盘文件上 为什么要判断文件打开是否成功呢?

21 【例13.2】 函数feof()检查是否到达文件尾,当文件位置指针指向文件尾时,返回非0值,否则返回0值
将0~127之间的ASCII字符写到文件中,然后从文件中读出并显示到屏幕上 函数feof()检查是否到达文件尾,当文件位置指针指向文件尾时,返回非0值,否则返回0值

22 【例13.3】 修改例13.2,从文件中读出字符时,判断是否为可打印字符,若是则显示该字符,否则显示其十进制ASCII码值

23 为什么在输出第128个字符的ASCII码值后又输出了一个-1呢?
【例13.3】 修改例13.2,从文件中读出字符时,判断是否为可打印字符,若是则显示该字符,否则显示其十进制ASCII码值

24 为什么在输出第128个字符的ASCII码值后又输出了一个-1呢?
【例13.3】 修改例13.2,从文件中读出字符时,判断是否为可打印字符,若是则显示该字符,否则显示其十进制ASCII码值 if (!iscntrl(ch)) 使用函数feof()时,仅当读到文件结束符时才能判断出到达文件尾,而文件结束符是一个值为-1的不可打印的控制字符

25 13.3按字符读写文件 字符串读写 char *fgets(char *s,int n,FILE *fp);
从fp所指的文件中读取字符串并在字符串末尾添加'\0',然后存入s,最多读n-1个字符 当读到回车换行符、文件末尾或读满n-1个字符时,函数返回该字符串的首地址 特例:fgets(buf, sizeof(buf), stdin); int fputs(const char *s, FILE *fp); 将字符串写入文件中 若出现写入错误,则返回 EOF,否则返回一个非负数

26 13.3按字符读写文件 【例13.4】用fgets()改写例13.1程序,从键盘输入一串字符,添加到文本文件demo.txt的末尾。假设文本文件demo.txt中已有内容为:I am a student.

27 13.4按格式读写文件 格式化读写 int fscanf(FILE *fp,const char *format,...);
fscanf(fp, "%d,%6.2f", &i, &t); 第1个参数为文件指针,第2 个参数为格式控制参数,第3 个参数为地址参数表列 int fprintf(FILE *fp,const char *format,...); fprintf(fp, "%d,%6.2f", i, t); 第1个参数为文件指针,第2 个参数为格式控制参数,第3 个参数为输出参数表列

28 【例13.5】修改例12.7程序,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件score.txt中
将平均分作为STUDENT结构体的成员,使函数的接口更简洁

29 【例13.5】修改例12.7程序,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件score.txt中

30 【例13.5】修改例12.7程序,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件score.txt中

31 【例13.5】修改例12.7程序,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件score.txt中

32 【例13.6】在例13.5基础上, 从文件score.txt中读出每个学生的4门课的平均分,各科成绩及平均分

33 【例13.6】在例13.5基础上, 从文件score.txt中读出每个学生的4门课的平均分,各科成绩及平均分

34 13.5按数据块读写文件 按数据块读写 从fp所指的文件中读取数据块并存储到buffer指向的内存中 buffer是待读入数块据的起始地址
size是每个数据块的大小(待读入的每个数据块的字节数) count是最多允许读取的数据块个数(每个数据块size个字节) 返回实际读到的数据块个数 将buffer指向的内存中的数据块写入fp所指的文件

35 【例13. 7】在前几个实例基础上,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件student
【例13.7】在前几个实例基础上,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件student.txt中,然后再从文件中读出数据并显示到屏幕上

36 【例13. 7】在前几个实例基础上,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件student
【例13.7】在前几个实例基础上,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件student.txt中,然后再从文件中读出数据并显示到屏幕上

37 【例13. 7】在前几个实例基础上,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件student
【例13.7】在前几个实例基础上,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件student.txt中,然后再从文件中读出数据并显示到屏幕上

38 【例13. 7】在前几个实例基础上,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件student
【例13.7】在前几个实例基础上,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件student.txt中,然后再从文件中读出数据并显示到屏幕上

39 【例13. 7】在前几个实例基础上,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件student
【例13.7】在前几个实例基础上,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件student.txt中,然后再从文件中读出数据并显示到屏幕上

40 【例13. 7】在前几个实例基础上,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件student
【例13.7】在前几个实例基础上,计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件student.txt中,然后再从文件中读出数据并显示到屏幕上

41 作业 习题 13.1 ~ 13.5 实验题 本章实验题 :学生成绩管理系统v6.0

42 Questions and answers


Download ppt "C语言程序设计 第13章 文件操作."

Similar presentations


Ads by Google