290 likes | 486 Views
程序设计基础( C 语言). 东北大学高级语言程序设计课程组 课程网站: www.neu.edu.cn/cxsj. 程序设计基础( C 语言). 文件. 1. 文件概念. 什么是文件 ? 文件是存储在外部介质上( 介质: 磁盘和磁带等外存储器)的数据或信息的集合 例如 程序文件中保存着源程序 数据文件中保存着数据 声音文件中保存着声音数据 磁盘上的每个文件都有唯一的名字,进行标识,依据文件名找到相应的文件 为什么要使用文件 文件的改动不能引起程序的改动,即程序与数据分离 不同的程序可以访问同一数据文件中的数据,即数据共享
E N D
程序设计基础(C语言) 东北大学高级语言程序设计课程组 课程网站:www.neu.edu.cn/cxsj
程序设计基础(C语言) 文件
1.文件概念 • 什么是文件? • 文件是存储在外部介质上(介质:磁盘和磁带等外存储器)的数据或信息的集合 • 例如 • 程序文件中保存着源程序 • 数据文件中保存着数据 • 声音文件中保存着声音数据 • 磁盘上的每个文件都有唯一的名字,进行标识,依据文件名找到相应的文件 • 为什么要使用文件 • 文件的改动不能引起程序的改动,即程序与数据分离 • 不同的程序可以访问同一数据文件中的数据,即数据共享 • 能够长期保存程序运行的中间数据或结果数据
1.文件概念 • C语言实现文件操作 • 通过操作系统完成对文件的输入输出操作 • 通过由C语言的编译系统提供的一套用于文件操作的库函数,也称为“标准输入/输出库” • 文件的特点 • 文件是一个有序的数据序列 • 保存的所有数据有着严格的排列次序(类似于数组) • 要访问文件中的数据,必须按照它们的排列顺序,依次进行访问
1.文件概念 • 文件的分类 • 数据的组织形式 • ASCII码文件 • ASCII码文件是将要存储的数据采用ASCII码的形式进行存储 • 数据按顺序组成一个一个的字符序列 • 每一个字符用一个ASCII码来表示,占用1个字节 • ASCII码形式的文件在文本编辑器下可以直接阅读 • 保存在内存中的所有数据在存入文件的时候都要先转换为等价的字符形式 • 当要从文件中读取数据时,在将字符串转换为浮点数 • 例如:123.45(浮点数) • 将123.45转换为字符串“123.45”再存放
1.文件概念 • 文件的分类 • 数据的组织形式 • 二进制文件 • 将数据按其在内存中的存储方式(二进制方式)原样输出到文件中存放的 • 内存中的数据存入磁盘的时候不需要进行数据转换 • 磁盘上保存的数据采用C语言规定的与内存数据一致的表示形式进行存储 • 例如:123.45存放字二进制文件中将会占用4个字节(浮点数)
1.文件概念 • 文件的分类 • 数据的组织形式 • 区别 • ASCII码文件较为直观、可读性好 • 方便人们的阅读和理解 • 可以直接在Windows下的记事本等工具直接观察 • 占用存储空间较多而且在数据输入输出时必须进行二进制代码和ASCII码之间的转换 • 二进制文件存储空间的利用效率高 • 输入输出时不需要进行转换,因而速度较快,可以节省磁盘空间和转换时间 • 二进制文件不能直接识别内存中的表示形式,不方便人们的阅读和理解,可读性差
计算机内存 出入文件缓冲区 程 序 数 据 区 输出 写文件 文件 输入 输出文件缓冲区 读文件 外存 1.文件概念 • 文件的分类 • 文件的处理方式 • 数据写入文件或从文件中读出数据的过程
1.文件概念 • 文件的分类 • 文件的处理方式 • “写文件” • 将保存在内存中的数据写入磁盘 • 首先要建立一个“输出文件缓冲区” • 通过该缓冲区可将内存中的数据存入磁盘,以文件的形式保存 • “读文件” • 将保存在文件中的数据装入内存 • 首先要建立一个“输入文件缓冲区”,将文件中的数据装入缓冲区 • 然后再由缓冲区存入程序可以操作的内存数据区
1.文件概念 • 文件的分类 • 文件的处理方式 • C语言系统对"缓冲区"的处理方式不同产生了两种不同的文件处理方式 • 缓冲文件系统 • 对每个正在使用的文件,系统自动地在内存中为其开辟一个缓冲区 • 非缓冲文件系统 • 指系统不会自动开辟缓冲区,而要由程序自行设置文件的缓冲区 • 提示 • 在ANSI C83标准中取消了非缓冲文件系统 • 对文本文件和二进制文件均统一采用缓冲文件系统进行处理
1.文件概念 • 文件的分类 • 文件的处理方式 • 缓冲文件的特点 • 缓冲区是一个连接计算机内存数据与外存文件的桥梁 • 在内存开辟一个“缓冲区”,为程序中的每一个文件使用 • 执行读文件的操作时,从磁盘文件将数据先读如内存“缓冲区”,装满后再从内存“缓冲区”依此读入进接收的变量 • 执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”写满后再写入文件 • 由此可见,内存“缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,操作外存的次数越少,执行速度就越快、效率就越高 • 一般来说:文件的“缓冲区”的大小随机器而定
2.文件的操作 • C语言中文件的操作主要是由C语言库函数实现 • 了解和掌握C语言提供的与文件有关的操作和规定 • 文件的定义 • 文件的状态 • 访问文件的基本操作 • 文件操作的函数属于C语言标准输入输出库中的函数 • 应在程序函数的前面使用预处理命令"#include“ • #include <stdio.h>
2.文件的操作 • 文件指针 • 每个正在使用的文件都要说明一个FILE类型的结构变量 • 该类型就是文件读写所需要分配的内存区域的类型 • 利用一个结构体类型的变量存放 • 该结构变量用于存放文件的有关信息 • 文件的名字、文件的性质、文件的当前状态等 • FILE 类型由系统定义 • 它包含的成员即FILE的各个分量由操作系统自动定义 • 在头文件stdio.h中定义 • 通过文件结构的数据集合进行输入输出处理 • 文件结构在打开文件时由操作系统自动建立
2.文件的操作 • 文件指针 • 在头文件stdio.h中定义的结构FILE typedef struct { short level; /*文件的缓冲区级别(满或空的程度)*/ unsigned flag; /*文件状态标志*/ char fd; /*文件号*/ int cleft; /*缓冲区的剩余字符(剩余空间)*/ int mode; /*文件的操作模式*/ short size; /*缓冲区大小*/ char *buffer; /*文件缓冲区的地址(位置)*/ char *curp; /*当前地址指针(下一个字符的位置)*/ short token; /*有效性检查控制单元*/ }FILE;
2.文件的操作 • 文件声明 • 定义文件类型之后才能用其声明若干个FILE类型的变量 • 存放文件的信息 • 在C程序中,凡是要对已打开文件进行操作,都要通过指向该文件结构的指针 • 定义FILE型(文件型)的指针变量 • 通过文件指针变量找到与它相关的文件 • 如果需要同时处理n个文件,一般需要说明n个指针变量使它们分别指向n个不同的文件,以实现对文件的访问我们只需要定义文件类型的指针 • 通过这个指针,程序与操作系统之间交流信息,使用文件
2.文件的操作 • 文件声明 • 格式 • 说明 • FILE是文件结构的类型名,标识结构类型 • 文件型指针是指向文件结构的指针 • 例如:FILE *p; /*p是一指向文件结构的指针变量*/ • 提示 • C语言中标准设备文件是由系统控制的 • 它们由系统自动打开和关闭 • 用户在程序中可以直接使用,无需再进行说明 • C语言中提供了三个标准设备文件的指针 • stdin 标准输入文件(键盘) • stdout 标准输出文件(显示器) • stderr 标准错误输出文件(显示器) FILE * 文件型指针名;
2.文件的操作 • 文件的操作过程 • 打开文件 • 建立用户程序与文件的联系 • 系统为文件开辟文件缓冲区 • 操作文件 • 对文件的读、写、追加和定位操作 • 读操作:从文件中读出数据 • 写操作:向文件中写入数据 • 其他操作 • 关闭文件 • 切断文件与程序的联系,将文件缓冲区的内容写入磁盘,并释放文件缓冲区
2.文件的操作 • 打开文件 • 操作系统分配一块内存区域 • 可以在这个区域上对文件进行读写操作 • 将该文件的基本状态信息装入内存的该区域 • 为了在后面对文件内容读写是能够找到这个内存区域,需要将这个内存区域的起始指针赋值给定义的FILE类型指针变量 • 通过库函数fopen调用实现 • 目的 • 在程序与操作系统之间建立一种关联 • 通过打开文件,程序把所要操作文件的要求:如要打开的文件名、文件的操作方式(读/写)等通知操作系统
2.文件的操作 • 打开文件 • fopen函数的调用形式 • 说明 • FILE是前面介绍的文件类型 • fp是一个指向FILE类型的指针变量 • 指向被打开的文件 • filename文件名 • 所要打开的文件名称 • mode文件使用方式 • 用具有特定含义的符号表示 FILE* fp; fp=fopen(char *filename,char *mode)
2.文件的操作 • 打开文件 • fopen函数的功能 • 以mode方式打开由文件名filename指定的文件 • 该函数的返回值为指针类型 • 若文件打开成功 • 返回一个指向该文件的指针 • 若文件打开失败 • 返回一个空指针NULL
2.文件的操作 例:打开文件的正确方法是 #include“stdio.h” FILE *fp; fp=fopen(“stu.dat”,“w”); /*以写方式打开当前目录下的stu.dat文件 并将返回的指向stu.dat文件的文件指针 赋给文件类型指针变量fp*/ if(fp==NULL) { printf(“cannot open file\n”); exit(0);}
2.文件的操作 【例】以写方式打开一个readme.txt文件。 #include “stdio.h” void main() { FILE *fp; fp=fopen(“readme.txt”,“w”); if(fp=NULL) { printf(“file not found!”); fclose(fp); } else printf(“file opened ok!”); } 可以在fopen打开文件时 检查函数的返回值是否 为NULL以确定文件是否 真正打开,若文件打开 失败,还使用读写函数 对文件进行读写操作将 会出现错误。
2.文件的操作 也可以写成下面这种方式: #include “stdio.h” void main() { FILE *fp; fp=fopen(“readme.txt”,“w”); if (fp=NULL) { printf(“file not found!”); exit(0); } else printf(“file opened ok!”); } exit(0)也是一个库 函数,定义在“stdio.h” 中,它起的作用是: (1)关闭所有文件; (2)程序正常退出; (3)返回操作系统; (4)将(0)返回操作 系统。 一般情况下:exit(0) 表示在程序设计者控制 的范围内正常退出; exit(!0)则表示程序 非正常退出。
2.文件的操作 • 文件的关闭 • 当对文件操作结束后,程序要通知操作系统文件使用完毕 • 关闭该文件 • 意味着释放文件指针以供别的程序使用 • 可以避免文件中数据的丢失 • 否则容易导致对文件的误操作 • 尤其是刚对文件进行写操作,如不关闭文件,可能会丢失刚刚写入的数据 • 关闭文件采用 C库函数fclose
2.文件的操作 • 文件的关闭 • fclose函数的调用形式 • 说明 • 文件指针是通过fopen打开的文件 • fclose函数关闭fopen打开的文件 • fclose函数返回值 • 返回值为整型 • 正常关闭时返回为0,否则返回为非0数,表示关闭出错 • 函数的功能 • 关闭由文件指针指定的文件 • 切断缓冲区与该文件的联系 • 释放文件指针 fclose (文件指针);
2.文件的操作 例:以读方式打开一个文本文件readme.txt然后关闭该文件。 #include “stdio.h” void main() { FILE *fp; fp=fopen(“readme.txt”,“r”); if (fp=NULL) printf(“file not found!\n”); else {printf(“file opened ok!\n”); fclose(fp); printf(“file closed!\n”);} }
2.文件的操作 文件的读写是整个文件操作的核心,也是最灵活多变的部分。 针对文本文件和二进制文件的不同性质进行分类操作,对文本文件可按字符读写或按字符串读写;对二进制文件可按成块读写或格式化读写。各种C语言编译系统都提供了丰富的文件读写函数,有一些库函数事实上已成为标准。 • 读写字符 C提供fgetc和fputc函数对文本文件进行字符的读写。 fgetc函数从输入流的当前位置返回一个字 符,并将文件指针指示器移到下一个字符 处,如果已经到文件尾部,函数返回EOF, 此时表示本次操作结束。fputc函数完成将 字符的值写入所指定的流文件的当前位置 处,并将文件指针后移一位。该函数的返 回值是所写入字符的值,出错时返回EOF。 函数定义格式: fgetc和fputc
例:从键盘输入字符存储在磁盘文件test.txt中。例:从键盘输入字符存储在磁盘文件test.txt中。 #include "stdio.h" main() { FILE *fp; char c; fp = fopen("test.txt","w"); /*以写的方式打开文件*/ if(fp == NULL) { printf("File doesn't exist\n"); exit(0); } while ((c= fgetchar()) != ‘\n’); /*只要输入字符为非空格符*/ fputc(c,fp); /* 写入文件一个字符 */ fclose(fp); }
读写字符串 fgets()函数从文件中读取至多num-1个字符,并将其放入 str指向的数组中。函数形式为: char *fgets(char *str,int num,FILE *STREAM) fputs()函数将str指向的字符串写入文件,操作成功时,函数返回值为0值,失败时返回非0值。函数形式为: int fputs(char *str,FIILE *stream) 【例】从一个文本文件中test1.txt中读出字符串,再写入另一个文 件test2.txt中。 #include<stdio.h> #include<string.h>