




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
文件与数据存储,提 纲,文件的基本概念文件的基本操作文件的读写数据存储小结,文件的基本概念,文件定义一组相关信息的集合;平时存储在外部介质上,需要时读入内存,操作完毕后再写回外部介质文件操作使用标准库函数,文件类型,二进制文件信息以二进制格式存储内容不分行,行尾无行结束标志读写时不发生数据转换,文件中的内容与信息在内存中的存储布局相同程序容易处理,程序员不容易理解文本文件信息以文本(字符串)格式存储文本分行,行尾有行结束标志读写时发生数据转换(自动或人工),转换过程可逆程序容易处理,程序员也容易理解,文件指针,文件指针类型文件指针类型格式: FILE *说明:所有对文件的操作都需要使用文件指针类型文件变量定义格式:FILE * fp;说明:要访问某个文件,一定需要首先定义文件指针类型的变量,并将该变量与对应文件关联起来,此后才能进行文件操作,文件的基本操作,文件打开操作文件关闭操作文件结束检测操作文件错误检测操作文件缓冲区与流刷新操作文件指针定位操作文件指针位置查询操作文件指针重定位操作,文件打开操作,文件打开函数 fopen函数原型:FILE * fopen( const char * filename, const char * mode );参数意义:filename 表示文件名(可带文件路径),mode 表示文件打开模式返回值:成功执行,返回文件的对应指针,否则返回 NULL注意:一定要检查 fopen 函数的返回值!,文件打开操作,文件打开模式“r”:读模式,若文件不存在,则返回 NULL“w”:写模式,若文件不存在则创建它,若文件已存在则其内容被擦除“a”:写模式,若文件不存在则创建它,若文件已存在则保留原内容,信息追加到文件尾部“r+”:读写模式,文件必须已存在,否则返回 NULL“w+”:读写模式,若文件不存在则创建它,若文件已存在则其内容被擦除“a+”:读写模式,若文件不存在则创建它,若文件已存在则保留原内容,信息追加到文件尾部“b”:二进制格式打开文件,文件打开操作,文件打开模式说明“b”模式注意:不能单独使用,必须与其他模式合并使用示例一:“rb”表示以二进制读模式打开文件示例二:“w+b”表示以二进制读写模式打开文件“a+”与“a”模式相同点:追加信息均写入文件尾部不同点:“a”模式不删除原始文件中的文件结束标志,部分程序不能读取新追加的信息建议:使用“a+”而不是“a”,文件关闭操作,文件关闭函数 fclose函数原型:int fclose( FILE * fp );参数意义:fp 表示待关闭的文件指针返回值:成功执行时返回 0,失败时返回 -1注意:测试函数时,要特别注意成功时为假(0),失败时为真(非 0),不同于标准库中其他函数!程序结束时,未关闭的文件自动关闭多个文件的关闭操作函数原型:int fcloseall();关闭除标准文件流之外的所有文件,标准文件流,什么是标准文件流C 语言为用户预定义的三个全局文件流数据对象定义于“stdio.h”中标准输入流stdin:代表输入设备(一般为键盘)用户输入均由系统自动放入该变量所代表的存储空间标准输出流stdout:代表输出设备(一般为屏幕)程序输出均由系统自动放入该变量所代表的存储空间标准错误流stderr:代表错误输出设备(一般为屏幕)程序错误输出均由系统自动放入该变量所代表的存储空间,文件结束检测操作,文件结束检测函数 feof函数原型:int feof( FILE * fp );参数意义:fp 表示待检测的文件指针返回值:文件结束时返回真,否则返回假feof 使用示例FILE * fp;fp = fopen( filename, w+ );if( !fp )printf(Failed in opening file %s., filename );while( !feof( fp ) ) / 文件的具体操作在此fclose( fp );,文件错误检测操作,文件错误检测函数 ferror函数原型:int ferror( FILE * fp );参数意义:fp 表示待检测的文件指针返回值:读写文件发生错误时返回真,否则返回假ferror 使用示例FILE * fp;fp = fopen( filename, w+ );if( !fp )printf( Failed in opening file %s., filename );while( !feof( fp ) ) if( ferror( fp ) ) / 发生文件读写错误,处理该错误fclose( fp );,文件缓冲区与流刷新操作,缓冲区系统为文件读写操作专门建立的数据中转站文件缓冲区与流刷新函数 fflush函数原型:int fflush( FILE * fp );参数意义:fp 表示待刷新的文件指针强制清空文件缓冲区中的所有内容多个文件流的刷新函数原型:int fflushall();意义:刷新程序使用到的所有文件流,文件指针定位操作,文件指针定位函数 fseek函数原型:int fseek( FILE * fp, long int offset, int origin );参数意义:fp 表示待定位的文件指针,offset 表示偏移量,origin 表示从什么位置开始计算偏移量返回值:成功执行返回 0,否则返回非 0origin 的取值SEEK_SET:从文件开头偏移 offset 字节,此时 offset 总为非负数SEEK_CUR:从文件当前位置偏移 offset 字节SEEK_END:从文件尾部偏移 offset 字节,此时 offset 总为非正数,文件指针位置查询操作,文件指针位置查询函数 ftell函数原型:long int ftell( FILE * fp );参数意义:fp 表示待查询的文件指针返回值:文件指针的位置ftell 的典型使用场合调用此函数获得文件指针位置,然后调用 fseek 函数定位到该位置制定的偏移处进行数据读写此函数很少使用,文件指针重定位操作,文件指针重定位函数 rewind函数原型:void rewind( FILE * fp );参数意义:fp 表示待重定位的文件指针rewind 的功能在使用文件一段时间后将文件指针重新移动到文件开头rewind:“倒带”此函数使用场合较少,文件的读写,面向字符的文件读写操作面向文本行的文件读写操作面向格式化输入输出的文件读写操作面向信息块的文件读写操作,字符读写操作,字符读取函数函数原型:int getc( FILE * fp );意义:从文件 fp 中读取单个字符,以整型返回字符写入函数函数原型:int putc( int c, FILE * fp );意义:将字符 c 写入文件 fp,返回值为写入的字符适用性适用文本文件,逐一字符操作,字符读写操作,#include int main() FILE * in, * out; int c; in= fopen( main.c, r ); if( !in ) printf( OpenFile: Failed in opening file %s., main.c ); return -1; out = fopen( main.bak, w ); if( !out ) printf( OpenFile: Failed in opening file %s., main.bak ); return -1; while( (c=getc(in) != EOF ) putc( c, out ); fcloseall(); return 0;,文本行读写操作,文本行读取函数函数原型:char * fgets( char * s, int n, FILE * fp );意义:从文件 fp 中读取最多 n 个字符,写入 s 所指向的存储空间,函数在遇到换行符或读取了 n 1 个字符之后结束返回值:成功执行时,返回 s,否则返回 NULL特别说明确保 s 指向的存储空间在调用此函数时已分配确保空间足够,字符串尾部0由系统自动添加;建议使用标准库中的 BUFSIZ 宏(512 字节)读取过程中如遇到 EOF,函数同样返回 NULL,文本行读写操作,文本行写入函数函数原型:int fputs( const char * s, FILE * fp );意义:将字符串 s 写入文件 fp返回值:成功时为写入的字符个数;否则为 EOF特别说明fputs 函数并不复制字符串尾部的0fputs 函数的返回值一般不需要测试适用性适用文本文件,按文本行模式操作,文本行读写操作,#include int main() FILE * in, * out; char bufferBUFSIZ; in= fopen( main.c, r ); if( !in ) printf( OpenFile: Failed in opening file %s., main.c ); return -1; out = fopen( main.bak, w ); if( !out ) printf( OpenFile: Failed in opening file %s., main.bak ); return -1; while( fgets( buffer, 3, in ) ) fputs( buffer, out ); fcloseall(); return 0;,格式化读写操作,文件格式化输出函数函数原型:int printf( const char * fmt, );函数原型:int fprintf( FILE * fp, const char * fmt, );函数原型:int sprintf( char * buffer, const char * fmt, );意义:fprintf、sprintf 函数意义与 printf 基本相同,fprintf 写入文件 fp,sprintf 写入字符缓冲区 buffer返回值:实际输出的字符个数,一般不需测试特别说明printf( fmt, ) 等价于 fprintf( stdout, fmt, ),文本行读写操作,编写程序,将随机生成的 5 个 0.01.0 之间的浮点数按照下述格式写入文本文件:a0=0.780090a1=0.809692a2=0.738953a3=0.724457a4=0.465240,字符读写操作,#include #include #include int main() FILE * out; double a10; int i; out = fopen( main.bak, w ); if( !out ) printf( OpenFile: Failed in opening file %s., main.bak ); return -1; srand(unsigned int)time(NULL); for( i=0; i5; i+ ) ai = rand()%10; for( i=0; i5; i+ ) fprintf( out, a%d=%8.6lfn, i, ai ); fclose(out); return 0;,格式化读写操作,文件格式化输入函数函数原型:int scanf( const char * fmt, );函数原型:int fscanf( FILE * fp, const char * fmt, );函数原型:int sscanf(const char *buffer, const char *fmt, );意义:fscanf、sscanf 函数意义与 scanf 基本相同,fscanf 从文件 fp,sscanf 从字符缓冲区 buffer 读取字符串,写入后续参数中返回值:实际输入的数据对象个数,一般不需测试特别说明scanf( fmt, ) 等价于 fscanf( stdin, fmt, ) 注意写入空间是否足够,格式化输入函数的格式描述符,存储空间问题,整数、浮点数一般不需要考虑空间是否足够问题字符串:要特别注意#define NUM_OF_ELEMENTS 10char nameNUM_OF_ELEMENTS;fscanf( fp, %9s, name );替代魔数 9char formatBUFSIZ;sprintf( format, %ds, NUM_OF_ELEMENTS 1 );fscanf( fp, format, name );,数据块读写操作,数据块读取函数:二进制格式读取原型:int fread( void * buffer, int size, int count, FILE * fp );意义:从文件指针 fp 指向的文件中读取 count 个大小为 size 字节的数据块,结果写入到 buffer 所指向的存储空间返回值:读取的数据块数,需要特别注意!数据块写入函数:二进制格式写入原型:int fwrite( void * buffer, int size, int count, FILE * fp );意义:向 fp 指向的文件中写入 count 个大小为 size 字节的数据块,数据来自 buffer 所指向的存储空间返回值:写入的数据块数,一般不需要测试,数据块读写操作示例,数据块写入示例要求:将整数数组 a 中前 10 个整数写入文件 fp每块包含一个整数,共 10 块 if( fwrite( a, sizeof(int), 10, fp ) != 10 ) printf( Error in writing data. );每块包含 10 个整数,共一块 if( fwrite( a, 10 * sizeof(int), 1, fp ) != 1 ) printf( Error in writing data. );,数据块读写操作示例,数据块读取示例一要求:从文件 fp 中读取 10 个整数,保存到数组 a 中,已知文件中至少包含 10 个整数 if( fwrite( a, sizeof(int), 10, fp ) != 10 ) printf( Error in reading data. );数据块读取示例二要求:从文件 fp 中最多读取 10 个整数,保存到数组 a 中,文件中包含多少整数未知(可能不够 10 个)如何实现?,数据块读写操作示例,数据块读取示例二:实现一数据块数未知,需要边读边判断文件是否结束错误代码: while( !feof( fp ) ) int e; if( fread( 错误结果:程序异常
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 主题公园沉浸式体验设计创新与项目运营成本控制研究报告
- 2025年实体书店新零售模式下的会员积分体系设计报告
- 2025年Z世代消费趋势与新消费品牌市场细分报告
- 2023江西“安全生产月”知识竞赛试题及参考答案
- 2023年科目四800题库及知识补充
- 2023福建省安全员B证考试题库
- 安徽省A10联盟2024-2025学年高二上学期9月初开学摸底考生物(B卷)试卷(含答案)
- 二零二五版房屋租赁合同范本(含租赁合同签订程序)
- 二零二五年度木托盘电商平台推广合作合同
- 二零二五年度棉布市场调研与数据分析合同
- 监护转让协议书
- 高中劳动教育课程
- 2025年保密知识考试试题及解析答案
- 【北京市人社局】2025年北京市人力资源市场薪酬数据报告(一季度)
- 监控项目合同书补充协议
- 签劳务派遣合同三方协议
- 初中英语单词总表2182
- 2025全国生态日知识竞赛考试题库(含答案)
- 阿里铁军培训课件
- 《Sketch Up 软件运用》课件(共九章)
- 多器官功能障碍综合征(MODS)的系统监测与全程护理管理实践
评论
0/150
提交评论