一文本流和二进制流二流文件三文件的打开函数fopen

上传人:s9****2 文档编号:578357308 上传时间:2024-08-24 格式:PPT 页数:21 大小:253.54KB
返回 下载 相关 举报
一文本流和二进制流二流文件三文件的打开函数fopen_第1页
第1页 / 共21页
一文本流和二进制流二流文件三文件的打开函数fopen_第2页
第2页 / 共21页
一文本流和二进制流二流文件三文件的打开函数fopen_第3页
第3页 / 共21页
一文本流和二进制流二流文件三文件的打开函数fopen_第4页
第4页 / 共21页
一文本流和二进制流二流文件三文件的打开函数fopen_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《一文本流和二进制流二流文件三文件的打开函数fopen》由会员分享,可在线阅读,更多相关《一文本流和二进制流二流文件三文件的打开函数fopen(21页珍藏版)》请在金锄头文库上搜索。

1、一、文本流和二进制流一、文本流和二进制流二、流文件二、流文件三、文件的打开函数三、文件的打开函数fopenfopen和关闭函数和关闭函数fclosefclose四、格式读写四、格式读写fprintffprintf和和fscanffscanf函数函数五、出错测试或清除函五、出错测试或清除函( (feof,ferror,clearerrfeof,ferror,clearerr) )1一、文本流和二进制流一、文本流和二进制流 内存中的信息会由于程序运行的结束而消失。程序运行内存中的信息会由于程序运行的结束而消失。程序运行的结果需要另外稳定的介质加以永久保存,这种可以长期保的结果需要另外稳定的介质加以

2、永久保存,这种可以长期保留数据的存储设备称为磁盘文件。下面几种是有影响的存储留数据的存储设备称为磁盘文件。下面几种是有影响的存储方式:方式: 1. ANSI C 运行库缓冲流的输出输出操作运行库缓冲流的输出输出操作 2. C 运行库低级输出输出操作运行库低级输出输出操作 3. iotream类提供的类提供的I/O操作操作 4. DOS 或或WINDOWS API 端口操作端口操作 5. Microsoft Foundation 类库的文件操作类库的文件操作 2在在C/C+中流可分为两类:中流可分为两类: 1) 文本流文本流(text stream); 1) 二进制流二进制流(binary st

3、ream) 文本流中的数据以字符形式出现,文本以行作为结束。文本流中的数据以字符形式出现,文本以行作为结束。 图图 数据的流入流出是一个相对概念数据的流入流出是一个相对概念 流流 入入 couta 流流 入入 磁盘磁盘 内存内存 缓冲区缓冲区 内存内存 数据区数据区 键盘键盘 stdin stdout显示器显示器 stderr 打印机打印机 stdprn3二、流文件二、流文件 流文件是流文件是C运行库函数中由运行库函数中由FILE结构有效处理的硬件设结构有效处理的硬件设备的逻辑描述。在这个称为标准文件备的逻辑描述。在这个称为标准文件I/O系统中系统中, 定义了三个定义了三个文本流:文本流: s

4、tdin,stdout和和stderr。一般对如下前。一般对如下前3个标准设个标准设备,系统构筑了流文件的索引方式,其相应的非缓冲区的文备,系统构筑了流文件的索引方式,其相应的非缓冲区的文件代号一并罗列如下:件代号一并罗列如下: 硬件设备硬件设备 预定义的流文件或流对象预定义的流文件或流对象 设备代号或句柄设备代号或句柄键键 盘(标准输入)盘(标准输入) stdin cin 0 显示器(标准输出)显示器(标准输出) stdout cout 1显示器(标准错误)显示器(标准错误) stderr cerr 2串行口(标准辅助)串行口(标准辅助) stdaux 3打印机(标准打印)打印机(标准打印)

5、 stdprn clog 4 4 描述流文件的描述流文件的FILE数据结构随编译器版本的不同而相数据结构随编译器版本的不同而相异,下面的描述摘自微软异,下面的描述摘自微软VC 6.0 头文件头文件stdio.h,该结构的,该结构的具体声明如下:具体声明如下: struct _iobuf char *_ptr; /1索引数据流内容的位置指索引数据流内容的位置指针针 int _cnt; /2当前的定位标志数当前的定位标志数 char *_base; /3缓冲区基准位置缓冲区基准位置 int _flag; /4文件操作模式标记文件操作模式标记 int _file; /5文件的代号文件的代号 int

6、_charbuf; /6字符缓冲信息字符缓冲信息 int _bufsiz; /7缓冲区大小缓冲区大小 char *_tmpfname; /8临时文件名临时文件名;typedef struct _iobuf FILE;5 对于该结构软件供应商并未逐一指明其中每一数据成员对于该结构软件供应商并未逐一指明其中每一数据成员的详细含义,标准输入输出函数的用户不要冒然直接去操作的详细含义,标准输入输出函数的用户不要冒然直接去操作其中的成员,而通过相应的函数间接进行。其中的成员,而通过相应的函数间接进行。 三个预定义的流文件在三个预定义的流文件在vc 6.0的的stdio.h中通过通过外部中通过通过外部说明

7、语句和宏:说明语句和宏: extern FILE _iob ;#define stdin (&_iob0)#define stdout (&_iob1)#define stderr (&_iob2) 就已经在内存中构建就已经在内存中构建, 因此不对这三个标准的因此不对这三个标准的I/O设备进设备进行建立和清除工作。但其它的流文件需要程序员调用相关的行建立和清除工作。但其它的流文件需要程序员调用相关的函数,进行规则的内存分配和释放工作。函数,进行规则的内存分配和释放工作。6三、文件的打开函数三、文件的打开函数fopen和关闭函数和关闭函数fclose1. 文件的打开函数文件的打开函数fopen

8、文件的打开函数文件的打开函数fopen是为要操作的磁盘文件对应的数是为要操作的磁盘文件对应的数据结构分配内存的函数,这是一个构建据结构分配内存的函数,这是一个构建FILE的数据结构变量的数据结构变量的初始化函数,系统通过调用类似的初始化函数,系统通过调用类似malloc的堆内存分配函数的堆内存分配函数完成了完成了FILE型结构变量的内存分配。下面是型结构变量的内存分配。下面是fopen函数一个函数一个简约的函数原型:简约的函数原型: FILE * fopen (const char *filename, const char *mode); 函数返回一个指向堆空间的函数返回一个指向堆空间的FI

9、LE *型的流文件指针。不型的流文件指针。不如确切地说该函数在堆空间诞生了一个如确切地说该函数在堆空间诞生了一个FILE型结构变量。型结构变量。7 两个两个const char *型的入口参数对上面的结构成员执行型的入口参数对上面的结构成员执行了部分初始化赋值。第一个参数了部分初始化赋值。第一个参数filename是定位磁盘文件路是定位磁盘文件路径的文件名,该文件名通常是双引号括起来的只读字符串。径的文件名,该文件名通常是双引号括起来的只读字符串。 在使用含路径的文件名时,注意在使用含路径的文件名时,注意“”的使用,对于硬的使用,对于硬盘盘中的文件中的文件d:mydocu_1ex.cpp 应写

10、成应写成 “d:mydocu_1ex1.cpp” 或进行如下的初始赋值或进行如下的初始赋值:const char *filename=d:mydocu_1ex1.cpp; 第二个以只读字符串的形式出现的参数第二个以只读字符串的形式出现的参数mode,界定文,界定文件访问操作的模式。(其有效的取值组合和含义见下一页)件访问操作的模式。(其有效的取值组合和含义见下一页) 8mode 含义含义 r 以以read only 方式打开一个文本文件,如果方式打开一个文本文件,如果 输入文件不存在或未找到输入文件不存在或未找到fopen失败失败 w 以以write only方式打开一个文本文件,如果方式打开

11、一个文本文件,如果 输出文件已存在,内容将全覆盖输出文件已存在,内容将全覆盖 a 以写和以写和append方式在文本文件末尾追加,如方式在文本文件末尾追加,如 果它不存在则先建立该文件果它不存在则先建立该文件 r+ 以读或写的方式打开一个必须已经存在的文以读或写的方式打开一个必须已经存在的文 本文件本文件 w+ 以读或写的方式打开一个空文件,如果给定的以读或写的方式打开一个空文件,如果给定的 文件名存在原来的内容将被冲洗文件名存在原来的内容将被冲洗 a+ 以读以读/写和追加方式打开文件,如果该文件不存写和追加方式打开文件,如果该文件不存 在则先建立它在则先建立它9 rb 以只读方式打开一个以只

12、读方式打开一个binary输入文件,如果文件输入文件,如果文件 不存在或未找到不存在或未找到fopen失败失败 wb 以只写方式打开一个二进制输出文件,如果文件以只写方式打开一个二进制输出文件,如果文件 已存在,内容将全覆盖已存在,内容将全覆盖 ab 以以append方式在方式在binary文件末尾追加,如果它文件末尾追加,如果它 不存在则先建立该文件不存在则先建立该文件 rb+ 以读或写的方式打开一个必须已经存在的二进制以读或写的方式打开一个必须已经存在的二进制 文件文件 wb+ 以读或写的方式打开一个空以读或写的方式打开一个空binary文件,如果文文件,如果文 件名存在原来的内容将被销毁

13、件名存在原来的内容将被销毁 ab+ 以读和追加方式打开二进制文件,如果该文件不以读和追加方式打开二进制文件,如果该文件不 存在则先建立它存在则先建立它10 指定文件的缺省操作类型取决于一个全局变量指定文件的缺省操作类型取决于一个全局变量 _fmode,vc6.0 里在头文件里在头文件stdlib.h中声明为中声明为extern int _fmode;,系统设置的默认值是文本方式即,系统设置的默认值是文本方式即: _fmode=O_TEXT=0x4000 如果从文本方式切换为二进制模式,可以在程序中令:如果从文本方式切换为二进制模式,可以在程序中令: _fmode= O_BINARY; 如果在打

14、开文件发生错误,则如果在打开文件发生错误,则fopen都返回都返回NULL即即0,其潜在的原因有:其潜在的原因有: a. 以读模式打开一个并不存在的文件以读模式打开一个并不存在的文件 b. 打开一个无权操作的文件(如该文件已标明只读或隐打开一个无权操作的文件(如该文件已标明只读或隐藏属性试图写追加打开)藏属性试图写追加打开) c. 以追加方式对文件操作但磁盘空间不足以追加方式对文件操作但磁盘空间不足112.2.文件的关闭函数文件的关闭函数fclosefclose 函数函数fclose专用于释放由函数专用于释放由函数fopen申请的堆空间,及申请的堆空间,及时完成缓冲区数据的到位。时完成缓冲区数

15、据的到位。fclose的函数原型为:的函数原型为: intint fclosefclose (FILE * (FILE * fpfp););fclose的函数原型为:的函数原型为:intint fclosefclose (FILE * (FILE * fpfp);); 其中入口形参匹配函数其中入口形参匹配函数fopen返回的指针值,函数返回的指针值,函数fclose调用成功返回数值调用成功返回数值0,否则返回,否则返回EOF即即-1。 该函数不操作预定义的流文件该函数不操作预定义的流文件stdin,stdout和和stderr,它们是指向全局结构变量的指针。这样函数调用:它们是指向全局结构变量

16、的指针。这样函数调用: fclosefclose ( (fpfp);); 就关闭了先前由就关闭了先前由fopen函数打开的文件指针所对应的堆空函数打开的文件指针所对应的堆空间。间。12四、格式读写四、格式读写fprintf和和fscanf函数函数 1. fprintf输出函数输出函数 fprintf输出函数的一般形式为:输出函数的一般形式为: int fprintf (FILE* pTarget, const char* format, argument_list); int fprintf (流文件的目的地,格式控制串,参量列表流文件的目的地,格式控制串,参量列表); fprintf函数格式

17、控制串与函数格式控制串与printf中的相同。将中的相同。将fprintf 的的第一个形参第一个形参pTarget取为实参取为实参stdout,其调用格式相当于,其调用格式相当于printf函数。即函数。即 fprintf (stdout,格式控制串格式控制串,参量列表参量列表); 相当于相当于: printf (格式控制串格式控制串,参量列表参量列表); 13 在使用在使用fprintf将内存数据写到磁盘文件之前,先要指明将内存数据写到磁盘文件之前,先要指明磁盘文件的目的所在,因此通过磁盘文件的目的所在,因此通过fopen函数的写模式获得目函数的写模式获得目标地址。标地址。如:如: FILE

18、 *fpWrite= fopen (writeFile , w);如此之后就可以调用的如此之后就可以调用的 fprintf 函数函数.如如: fprintf (fpWrite, format, v_list); fprintf (流文件目的地流文件目的地, 格式控制串格式控制串, 变量列表变量列表);142. fscanf输入函数输入函数 fscanf函数的一般形式为:函数的一般形式为: int fscanf (FILE* pSource, const char* format, address_list); int fscanf (流文件的来源处流文件的来源处, 格式控制串格式控制串, 变量

19、的地址列表);变量的地址列表); 将将fscanf的第一个形参的第一个形参pSource实参化为实参化为stdin,其调,其调用格式相当于用格式相当于scanf函数。即:函数。即: fscanf ( stdin, 格式控制串格式控制串, 变量地址变量地址1, 变量地址变量地址2 . 变量地址变量地址n);相当于:相当于: scanf (格式控制串格式控制串, 变量地址变量地址1, 变量地址变量地址2 . 变量地址变量地址n); 15 在调用在调用fscanf函数将磁盘源文件中的数据送到变量所占函数将磁盘源文件中的数据送到变量所占住的内存之前,先应指明待读的磁盘文件,因此借助住的内存之前,先应指

20、明待读的磁盘文件,因此借助fopen函数的读模式得到数据源流的地址函数的读模式得到数据源流的地址如:如: FILE *fpRead= fopen (readFile, r);如此之后就可以调用输入函数如此之后就可以调用输入函数fscanf。格式为:格式为: fscanf (fpRead, format, address_list);16 例例 格式转换处理一个结构变量格式转换处理一个结构变量.#include typedef struct SData int nLineset; float fAdjust; int nPoint; float fXa; float fYa; float fZa

21、; CData; void OutputData (const char *filename, const CData &d ) FILE *fp= fopen(filename, w); fprintf (fp,%d,%f,%dn,d.nLineset,d.fAdjust,d.nPoint);/1 fprintf (fp,%f,%f,%fn, d.fXa,d.fYa,d.fZa);/2 fclose (fp); 17void InputData (const char *filename, CData &d ) FILE *fp = fopen (filename, r); fscanf (

22、fp, %d, %f, %d, &d.nLineset, &d. fAdjust, &d.nPoint); fscanf (fp,%f,%f,%f, &d.fXa, &d.fYa, &d.fZa); /2 fclose (fp); 18void main (void) CData s= 1,2,3,4,5,6; OutputData (c:sdata.out, s); CData d; InputData (c:sdata.out, d); OutputData (c:cdata.out, d); 在文件在文件c:cdata.out中输出结果为:中输出结果为: 1,2.000000,3 4.0

23、00000,5.000000,6.000000在文件在文件c:sdata.out中输出结果为:中输出结果为: 1,2.000000,3 4.000000,5.000000,6.00000019五、出错测试或清除函五、出错测试或清除函(feof,ferror,clearerr)1. feof函数测试文件结束标志函数测试文件结束标志 feof函数的原型为:函数的原型为: int feof (FILE *stream);该函数的调用格式常为:该函数的调用格式常为: while (!feof (stream) 读写循环体读写循环体;2. ferror函数测试流中的错误函数测试流中的错误 ferror函数的原型为:函数的原型为: int ferror (FILE *stream);3. clearerr函数清除错误标志为函数清除错误标志为0 clearerr函数原型为函数原型为: void clearerr (FILE *stream);2021

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号