版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十一章 文件C语言程序设计学习目的:能够建立、读写和更新文件熟悉顺序存取文件的处理方式熟悉随机存取文件的处理方式第十一章 文件第十一章 文件11.1 C文件概述 文件( file ) 是指存储在外部介质上数据的集合。操作系统则是以文件为单位对数据进行管理的. C 语言中文件是流式文件,即文件是一个字节流或二进制流.并以字节为单位进行存取. 根据文件中数据的存储方式,C 语言的文件可分为: 文本文件(ASCII码文件)和二进制文件。1. 文本文件 文件中每一个字符占一个字节,按其ASCII码存放。 特点: 可直接阅读,也可按字符逐个处理。但占用存储空间较大,同时需要额外的转换时间. 转换数据写
2、入文件时:二进制码转换成ASCII码数据读入内存时:ASCII码转换成二进制码2.二进制文件 二进制文件是将数据按其在内存中的存放形式直接存入文件中.特点:节省存储空间和转换时间,但不能直接阅读。一般用于存放数据或中间结果,以提高处理速度。C 语言中可采用“缓冲文件系统”和“非缓冲文件系统”来处理文件.缓冲文件系统: 系统自动在内存区为每一个正在使用的文件开辟一个缓冲区,数据的输入和输出都先经过缓冲区。非缓冲文件系统:是指系统不自动为文件开辟缓冲区,而是由用户程序自己为文件设定缓冲区。 新标准C中规定,只采用“缓冲文件系统”。 每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如:
3、文件的名字 、文件状态与文件当前位置等)。这些信息保存在一个 结构体类型的变量中。 结构体类型是由系统定义的,名为 FILE 。 在 stdio.h 文件中有以下的文件类型声明: typedef struct char level ; /* 缓冲区满或空 的程度 */unsigned flags ; /* 文件状态标志 */char fd ; /* 文件描述符(文件号) */unsigned char hold ; /* 如无缓冲区不读取字符 */char bsize ; /* 缓冲区大小 */unsigned char *buffer ; /* 数据缓冲区的位置 */unsigned cha
4、r *curp ; /* 指针,下一个字符的位置 */unsigned istemp ; /* 临时文件,指示器 */char token ; /* 用于有效性检查 */ FILE ; 11,2 文件类型指针11.3 文件的基本操作 文件的打开1 .文件的打开与关闭 FILE *fp(或其他指针变量名); fp=fopen(文件名,文件使用方式);fopen()函数文件名文件使用方式要打开的文件的名字以何种方式打开文件均是字符串 主要功能是为需要打开的文件分配一个缓冲区,并返回该缓冲区的首地址。如果不能实现“打开”的任务,fopen函数将会带回一个出错信息if (fp=fopen(file1,
5、r) = NULL)printf(cannot open this filen);exit(0);在用户登录时,系统自动打开 3 个标准文件:stdin : 标准输入文件,指向终端输入(例如,键盘输入)。stdout : 标准输出文件,指向终端输出 (例如,显示器和打印机)。stderr : 标准出错文件,指向终端输出(例如,显示器)。文件使用方式含 义 r(只读) 为输入打开一个已存在的文本文件。 w(只写) 为输出创建新文件,(若文件已存在,则文件内容被清空) a (追加数据) 只用于向已存在的文件的末尾添加数据。 rb(只读)为输入打开一个已存在的二进制文件。wb(只写)为输出打开一个二
6、进制文件。若文件不存在,则创建新文件ab(追加)打开一个已存在的二进制文件,在文件尾追加数据。r+(读/写)为读写打开一个已存在的文本文件。w+(读/写)建立一个新文本文件。若文件已存在,则文件内容被清空a+(读/写)保留已存在的文件,可以添加数据,也可以读取数据rb+(读/写)为读写打开一个已存在的二进制文件。wb+(读/写)建立一个新的二进制文件,若文件已存在,则文件内容被清空ab+(读/写)保留已存在的文件,可以添加数据,也可以读取数据 文件的关闭(fclose 函数 )关闭文件 就是使文件指针不再指向该文件,即使文件指针变量与文件“脱钩”。C 语言中用 fclose( ) 函数来关闭文
7、件, fclose 函数的调用形式是 :fclose (文件指针) ; 如果fclose 函数关闭文件成功,则返回零值;如果fclose 函数关闭文件失败,则返回非零值 EOF( -1),EOF 为文件结束符。用户应该养成在程序结束以前关闭所有文件的习惯,如果不关闭文件将会丢失数据。fclose 函数在程序结束以前先把文件缓冲区中的数据输出到磁盘文件, 然后才释放文件指针变量。11.4 文件的读写1. fputc函数和fgetc函数2. fputs函数和fgets函数3. fprintf函数和fscanf函数4. rewind函数和fseek函数5. fread函数和fwrite函数 fput
8、c函数和fgetc函数fputc函数:把一个字符写到文件中去fgetc函数:从指定的文件读入一个字符ch=fgetc(fp);while(ch!=EOF)fputc(ch,stdout);ch=fgetc(fp);putchar(ch);EOF 是在 stdio.h 中 定义的符号常量,值为 -1。由于字符的ASCII 码不可能出现 -1,应此定义 EOF 为-1 是合适的。EOF 不是可输出字符,因此不能在屏幕上显示。用于表示文件结束,只适用于文本文件。 fputc函数和fgetc函数如果想顺序读入一个二进制文件中的数据,可以用:while(!feof(fp)ch=fgetc(fp);.对于
9、 二进制文件,某个字节中的数有可能是 -1,因此难于用 EOF 判断文件是否结束,这时可以用函数 feof( fp) 来测试 fp 所指的文件当前是否 “文件结束”,是则返回 1,不是则返回 0 。例1:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个“#”为止。例2: 将某一磁盘文件中的信息复制到另一个磁盘文件中。主函数main带参数int main(int argc,char* argv) argc是命令行总的参数个数 argv是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数,main函数的参数值是从操作系统命令行上获得的。当我们要运行一个可执行
10、文件时,在DOS提示符下键入文件名,再输入实际参数即可把这些实参传送到main的形参中去。编程实现类似DOS下的拷贝命令:copy 源文件 目的文件 fputs()函数 格式 fputs(str,fp);将str指向的一个字符串,舍去结束标记0后写入fp所指向的磁盘文件上。正确,则返回写入文件的实际字符数;错误,则返回EOF(-1)。fgets()函数 格式 fgets(str, n, fp);从文件fp中读取n-1个字符,在其后补充一个字符串结束标记0,组成字符串并存入str指定的内存区。正确,则返回str对应的地址;错误,则返回NULL(0) fputs函数和fgets函数 fprintf
11、函数和fscanf函数函数fprintf和fscanf分别与printf和scanf相仿,都是格式化读写函数。只是fprintf和fscanf的读写对象不是终端而是磁盘文件。int num;float score;FILE * fp1, *fp2;fp1 = fopen(in.txt, r);fp2 = fopen(out.txt, w);fscanf(fp1, %d,%f, &num, &score);fprintf(fp2, %d,%6.2f, num, score); 文件中有一个位置指针,指向当前读写的位置,如果顺序读写文件,每次读写一个字符,则读写完一个字符后,位置指针自动指向下一个
12、字符位置。如果要强制使位置指针指向其它位置,可用以下函数: 1. rewind 函数使位置指针重新 返回文件开头。此函数没有返回值。调用形式为: rewind(fp) ;例3: 有一个磁盘文件file.txt,第一次将它的内容显示在屏幕上 ,第二次把它 复制到file2.txt文件上。 rewind 函数和fseek函数“位移量” 是指以“起始点”为基点 ,向前移动的字节数。一般地 , 位移量用 long 型数据。“起始点” 用 0 、1 、2 表示: 0 文件开始 1 当前位置 2 文件末尾2 fseek 函数和 随机读写顺序读写 位置指针按字节位置顺序移动 ;随机读写 位置指针按需要移动到
13、任意位置进行读写 。用fseek函数可以实现改变文件的位置指针,一般调用形式是 : fseek( 文件类型指针 , 位移量 , 起始点 )fseek函数一般用于二进制文件,因为文本文件要发生字符转换,计算位置时会发生混乱。例 :fseek (fp , 100 L , 0) ; -将位置指针移到离文件头100个字节处fseek (fp , 50 L , 1) ; -将位置指针移到离当前位置50个字节处fseek (fp , -10 L , 2) ; -将位置指针移到离文件尾向前10个字节处例3: a1.txt文件存放26个字母,要求先显示该文件中的所有内容,再显示奇数位中的所有字母。显示结果如下
14、:3 ftell 函数 ftell 函数的作用是得到流式文件中的当前位置,用相对于文件头的位移量来表示。 例如: i = ftell ( fp ) ; 返回 fp 所指的文件中当前的文件指针位置, 变量 i 存放当前位置,如果调用出错,返回值为 -1L。例:如何求指定文件的长度5. fread函数和fwrite函数作用: 用于一次读入和输出一个数据块。 格式: fread( buffer , size , count , fp ) fwrite( buffer , size , count , fp ) 其中: buffer 是一个指针,表示读入数据的存放起始地址和要输出数 据的起始地址. s
15、ize : 表示要读写的字节数. count : 表示要进行读写多少个 size 字节的数据项,即读 写的次数. fp: 文件指针, 应指向被操作的文件. fread 和 fwrite 函数调用正常时,其返回值为count 的值. 例 float f2; FILE *fp; fp=fopen(“aa.dat”,“rb”); fread(f,4,2,fp);for(i=0;i2;i+) fread(&fi,4,1,fp);例 struct student int num; char name20; char sex; int age; float score3; ; struct student stud10; for(i=0;i10;i+) fread(&studi,sizeof(struct student),1,fp);例 从键盘输入学生记录,把转存到一个二进制文件stu.dat中去. 运行结果如下:例 8:编写一个程序,对文件stud.dat 加密
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度环保技术研发项目提成合同
- 2025年石材开采权租赁合同实施细则
- 二零二五年度2025年门面租赁合同续签条件协议
- 成都期末统考数学试卷
- 个人品牌授权使用合同(2024版)3篇
- 大数据决策支持系统案例分析-深度研究
- 智慧城市感知网构建策略-深度研究
- 二零二五年度商业街区地下车库车位租赁管理合同范本3篇
- 2025年度矿山地质勘探与测绘工程承包合同4篇
- 数据驱动的决策制定-深度研究
- GB/T 44888-2024政务服务大厅智能化建设指南
- 2023-2024学年江西省萍乡市八年级(上)期末物理试卷
- 四则混合运算100道题四年级上册及答案
- 四川省高职单招电气技术类《电子基础》历年考试真题试题库(含答案)
- 中级半导体分立器件和集成电路装调工技能鉴定考试题库(含答案)
- 2024年江西生物科技职业学院单招职业技能测试题库带解析答案
- 桥本甲状腺炎-90天治疗方案
- (2024年)安全注射培训课件
- 2024版《建设工程开工、停工、复工安全管理台账表格(流程图、申请表、报审表、考核表、通知单等)》模版
- 部编版《道德与法治》六年级下册教材分析万永霞
- 酒店人防管理制度
评论
0/150
提交评论