




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,第9章 数据的永久性存储,C语言程序设计,数据的永久性存储,文件的组织方式,文件的操作,2,存储设备,内部存储设备,外部部存储设备,3,1 数据的永久性存储,文件是永久性存储设备的最基本存储单位。文件能够大量的、永久性的保存数据信息,并能够通过各种文件操作功能来管理和使用这些数据。,文件概念:文件是指存储在永久性存储设备上的具有名字(文件名)的一组相关数据的集合,通常也被称为磁盘文件。,4,2 文件的组织方式,根据编码方式,文件可以分为两种:一种是文本文件(ASCII码文件),另一种是二进制文件。,通过C语言编程实现对文件的访问时,必须要严格按照文件原有的编码方式及文件存储格式来对文件进行
2、访问操作,才能正确读写文件数据。,5,3 文件的操作,文件操作主要包括读文件和写文件等。 读文件是指从文件中把数据信息读入内存中,以供程序调用; 写文件是指把内存中的数据信息输出到永久性存储设备上的文件中,起到保存数据和实现数据共享的功能。,6,头文件stdio.h定义了文件结构体类型FILE,用来保存文件的文件名、文件的状态和文件当前的读写位置等相关文件信息。,3.1 stdio.h,typedef struct short level;/* 缓冲区满或空的程度 */ unsigned flags;/* 文件状态标志 */ char fd;/* 文件描述符 */ unsigned char
3、hold;/* 如无缓冲区不读字符 */ short bsize;/* 缓冲区的大小 */ unsigned char *buffer;/* 数据缓冲区的位置 */ unsigned char *curp;/* 文件内位置指针当前的指向 */ unsigned istemp;/* 临时文件指示器 */ short token;/* 用于有效性检查 */ FILE;,7,C语言的文件操作编程时 ,用FILE来定义一个文件结构体类型指针变量(通常称为文件指针),用来指向被访问的文件并通过该文件指针变量来访问文件信息。文件指针定义形式:,3.1 stdio.h,上面的C程序语句定义了一个文件指针fp
4、,但fp指向哪个文件,目前并不知道,只有通过文件打开函数让fp指向某个指定文件,将fp与该文件关联起来,才能使用fp。,FILE *fp;/* 定义文件结构体类型指针变量 */,8,C语言是以文件流的形式来对文件进行访问操作的。为了便于对文件流的顺序访问和随机定位访问,在文件内部还有一个位置指针来指向文件的当前读写操作位置,这就是文件结构体FILE中的成员指针变量curp。,3.1 stdio.h,9,stdio.h中关于文件的宏定义 :,3.1 stdio.h,#define SEEK_SET 0 /* 表征文件头位置*/ #define SEEK_CUR 1 /* 表征文件位置指针当前 所
5、处位置*/ #define SEEK_END 2 /* 表征文件尾位置*/ #define EOF -1 /* 文件结束标识宏常量*/,10,3.1 stdio.h,stdio.h中关于文件的常用函数,11,3.2 文件的打开与关闭,(1) 文件打开函数fopen(),原 型:FILE *fopen( const char *filename, const char *mode ); 头文件:#include 功 能:以指定方式打开所指定的文件 参 数:filename 文件路径加文件名, mode 文件打开方式 返回值:若打开文件成功,则返回文件指针值; 否则,返回NULL,12,3.2 文
6、件的打开与关闭,(2) 文件关闭函数fclose(),原 型:int fclose(FILE *stream); 头文件:#include 功 能:关闭文件 参 数:stream 文件指针 返回值:若关闭文件成功,则返回0; 否则,返回EOF,13,3.2 文件的打开与关闭,只读(输入/文件必须已存在),只写(输出),只追加,可读/追加,可读/写,可读/写(文件必须已存在),关于文件的打开方式:,打开方式,14,#include #include void main() FILE *fp; int nclose; fp=fopen(d:c1.c,r); /*以只读方式打开文件*/ if(NUL
7、L=fp) printf(open file errorn); exit(-1); /此处可放置若干文件操作代码 nclose=fclose(fp); /*如果关闭成功返回0,否则返回EOF*/ if(EOF=nclose) printf(file close errorn); ,15,3.3 文件读/写函数及与读写相关的函数,文件结束标识测试函数feof() 文件操作错误测试函数ferror() 字符读/写函数fgetc ()和fputc () 字符串读/写函数fgets()和fputs() 格式化读/写函数fscanf()和fprintf() 数据块读/写函数fread()和fwrite(
8、),16,3.3 文件读/写函数及与读写相关的函数,原 型:int feof(FILE *stream); 头文件:#include 功 能:文件结束标识符测试 参 数:stream 文件指针 返回值:若文件内部读写位置指针正指向文件尾, 则返回非0值;否则,返回0值,if (! feof(fp)/* 如果没有遇到文件尾则执行操作 */ /* 文件读写操作代码 */ ,文件结束标识测试函数feof(),17,3.3 文件读/写函数及与读写相关的函数,文件操作错误测试函数ferror(),原 型:int ferror(FILE *stream); 头文件:#include 功 能:文件操作错误测
9、试 参 数:stream 文件指针 返回值:若出现错误,则返回非0值; 否则,返回0值,if (ferror(fp)/* 如果文件读或写出错 */ /* 文件读写错误处理程序代码 */ ,18,#include #include int main(void) FILE *fp; if(fp=fopen(gcy1.txt, r)=NULL) printf(Cannot open file.n); exit(1); putc(C, fp); if(ferror(fp) printf(File Errorn); exit(1); fclose(fp); ,19,3.3 文件读/写函数及与读写相关的函
10、数,字符读/写函数fgetc ()和fputc (),原 型:int fgetc(FILE *stream); 头文件:#include 功 能:从文件中读入一个字符 参 数:stream 文件指针 返回值:成功执行则返回所读取字符(字节)的 整数值;否则,返回EOF,ch = fgetc(fp); /* 从fp所指向的文件流读取 一个字符,并赋给字符变量ch */,20,例1 编程实现把文件1.c显示在屏幕上。,3.3 文件读/写函数及与读写相关的函数,#include #include void main() FILE *fp; int nclose; fp=fopen(d:c1.c,r)
11、; /*以只读方式打开文件*/ if(NULL=fp) printf(open file errorn); exit(-1); ,/此处可放置若干文件操作代码 while(!feof(fp) putchar(fgetc(fp); printf(nn显示完毕n); nclose=fclose(fp); /*如果关闭成功返回0, 否则返回EOF*/ if(EOF=nclose) printf(file close errorn); ,21,3.3 文件读/写函数及与读写相关的函数,字符读/写函数fgetc ()和fputc (),原 型:int fputc(int ch, FILE *stream
12、); 头文件:#include 功 能:把字符ch写入到文件中 参 数:ch 字符,stream 文件指针 返回值:成功执行则返回所写入字符的整数 值;否则,返回EOF,fputc(ch, fp);/* 把字符ch写入到文件中 */,22,3.3 文件读/写函数及与读写相关的函数,例2 编程实现把文件1.c另存为新文件1_new.c。,#include #include void main(void) FILE *fp, *fpNew; int nCh, nResult; fp = fopen(d:c1.c,r); /* 以只读方式打开文件1.c */ if (NULL= fp) printf
13、(Open file 1.c errorn); exit(-1); ,23,fpNew = fopen(1_new.c,w);/* 创建1_new.c并以只写方式打开*/ if (NULL= fpNew) printf(Create file 1_new.c errorn); exit(-1); while(!feof(fp) /* 未遇到文件尾时循环读写操作 */ nCh = fgetc(fp); /* 从文件1.c读取字符 */ if(EOF != nCh) nResult = fputc(nCh,fpNew); /* 把字符写到文件1_new.c中 */ if(EOF = nResult
14、) printf(Write character to 1_new.c errorn); exit(-1); putchar(nCh); fclose(fp); fclose(fpNew); printf(nFile saveas successfully!n); ,24,3.3 文件读/写函数及与读写相关的函数,字符串读/写函数fgets()和fputs(),原 型:char *fgets(char *s, int n, FILE *stream); 头文件:#include 功 能:从文件中读入一个长度为n-1的字符串 参 数:s 字符串, n 要读入的字符串总长度 (空字符计算在内),
15、stream 文件指针 返回值:返回字符指针s的值,25,3.3 文件读/写函数及与读写相关的函数,字符串读/写函数fgets()和fputs(),原 型:int fputs(char *s, FILE *stream); 头文件:#include 功 能:把字符串s写入到文件中 参 数:s 字符串, stream 文件指针 返回值:成功执行则返回一个非负整数值; 否则,返回EOF,26,3.3 文件读/写函数及与读写相关的函数,例2 把从键盘输入的一个字符串写到文件gcy1.txt中,再从文件中把该字符串读出来显示到屏幕上。,#include #include #include void m
16、ain() FILE *fp; char str81, strNew81, *pCh; int nResult, nLen;,27,gets(str); /* 获取键盘输入字符串 */ nLen = strlen(str); /* 计算字符串长度 */ nResult = fputs(str, fp); /* 把字符串写入文件中 */ if(EOF = nResult) printf(Write string to gcy1.txt errorn); exit(-1); printf(Write string to file completelyn); fclose(fp);,fp = fop
17、en(gcy1.txt, w+); /* 创建文件gcy1.txt并打开*/ if (NULL= fp) printf(Open file gcy1.txt errorn); exit(-1); ,例2 把从键盘输入的一个字符串写到文件gcy1.txt中,再从文件中把该字符串读出来显示到屏幕上。,28,fp = fopen(gcy1.txt, r); /* 以只读方式重新打开gcy1.txt */ if (NULL= fp) printf(Open file gcy1.txt errorn); exit(-1); pCh = fgets(strNew, nLen+1, fp); /* 从文件中
18、读取字符串 */ if(NULL = pCh) printf(Read string from gcy1.txt errorn); exit(-1); puts(pCh); /* 输出字符串到屏幕,此处也可把pCh替换成strNew */ fclose(fp); ,例2 把从键盘输入的一个字符串写到文件gcy1.txt中,再从文件中把该字符串读出来显示到屏幕上。,29,3.3 文件读/写函数及与读写相关的函数,格式化读/写函数fscanf()和fprintf(),原 型:int fscanf(FILE *stream, const char *format, ); 头文件:#include 功
19、 能:文件格式化读取 参 数:stream 文件指针, format 格式控制字符串, 可变数目变量列表 返回值:成功执行则返回所读取的字节数; 否则,返回EOF,30,3.3 文件读/写函数及与读写相关的函数,格式化读/写函数fscanf()和fprintf(),原 型:int fprintf(FILE *stream, const char *format, ); 头文件:#include 功 能:文件格式化输出 参 数:stream 文件指针, format 格式控制字符串, 可变数目变量列表 返回值:成功执行则返回所写入的字节数; 否则,返回一负数值,31,3.3 文件读/写函数及与读
20、写相关的函数,例3 从键盘分别输入整数、浮点数、字符、字符串各一个,要求把这些数据按照键盘输入时的格式写到文件gcy2.txt中,然后从文件中把这些数据按原有格式读入并显示到屏幕上。,32,#include #include #include void main() FILE *fp; int nNum, nResult; float fData; char ch, str30; printf(Please input an integer, a float, a char and a string like this:n); printf(2012,12.04,M,207nn); scanf
21、(%d,%f,%c,%s, ,33,nResult = fprintf(fp, %d,%.2f,%c,%s, nNum, fData, ch, str); /* 格式化写入文件 */ if(nResult 0) printf(Write formatted data to gcy2.txt errorn); exit(-1); printf(Write formatted data to file completelyn); nNum = 0;/* 清空各变量 */ fData = 0.0; ch = 0; strcpy(str,); fseek(fp, 0L, SEEK_SET); /* 把
22、文件内部读写位置指针重新定位到文件头 */ nResult=fscanf(fp,%d,%f,%c,%s, ,34,3.3 文件读/写函数及与读写相关的函数,数据块读/写函数fread()和fwrite(),原 型:size_t fread(void *buffer, size_t size, size_t count, FILE *stream); 头文件:#include 功 能:读取文件数据块 参 数:buffer 数据存储区指针, size 数据项字节数, count 数据项数, stream 文件指针 返回值:返回实际读取的数据项数,type unsigned int size_t;,
23、35,3.3 文件读/写函数及与读写相关的函数,数据块读/写函数fread()和fwrite(),原 型:size_t fwrite(void *buffer, size_t size, size_t count, FILE *stream); 头文件:#include 功 能:写数据块到文件中 参 数:buffer 数据存储区指针, size 数据项字节数, count 数据项数, stream 文件指针 返回值:成功执行,则返回值等于count; 若返回值小于count,则说明写数据库出错,type unsigned int size_t;,36,3.3 文件读/写函数及与读写相关的函数,
24、例4 现有内容为“The 2008 Beijing Olympic Games were truly exceptional Games!”(共60个字符,包括空格字符在内)的文本文件gcy3.txt,将其加密成一个二进制文件gcy3.bin。加密算法是把从文件中读出的所有字符按其在文件中的排列顺序依次加上数值059。,37,#include void main(void) FILE *stream; char list80; int i, NumRead, NumWritten; if(stream = fopen(gcy3.txt, r )!= NULL) /*打开文件*/ NumRead
25、= fread(list, sizeof(char), 60, stream); /* 从文件中读取60个字符 */ printf(Number of items read = %dn, NumRead); /* 输出所读取的字符数 */ printf(Contents of buffer = %.60sn, list); /* 输出所读取的字符块 */ fclose(stream ); else printf(File could not be openedn);,38,if(stream = fopen( gcy3.bin, wb) != NULL) /* 创建新的二进制文件 */ for ( i = 0; i 60; i+ ) listi = (char)(listi + i); /* 通过字符运算进行简单加密 */ NumWritten= fwrite(list, sizeof(char), 60, stream); /* 把加密后的字符块写入文件中 */ printf(Wrote %d itemsn, NumWritten); /* 输出已写入文件的字符数 */ fclose(stream); else printf(File could not be openedn); ,39,3.4 文件定位函数,函数rewind() 函数fseek()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 长尾关键词2025年环保政策对塑料制品行业市场环保政策应对策略研究报告
- 2025年跨文化交流能力培养在国际化教育中的跨文化能力培养路径
- 黑龙江省龙东联盟2024-2025学年高一下学期期末考试化学试题(图片版含答案)
- 全国安全员证考试题型及答案
- 三级安全教育试题及答案车间级
- 数据库期末考试试题及答案
- 典当程序管理办法
- 养老入住管理办法
- 兽药饲料管理办法
- 内江招生管理办法
- 碧桂园工程技术管理方案
- 广西工业职业技术学院招聘笔试真题2024
- 天津市南开区2024-2025学年七年级下学期期末语文试题(含答案)
- 2025至2030中国无人驾驶汽车行业发展趋势分析与未来投资战略咨询研究报告
- 2025年数字化转型与企业管理培训考试卷及答案
- 2025-2030中国电子级氟化液行业前景动态与供需趋势预测报告
- 邵雍《渔樵问对》(原文+译文+解读)
- 喷涂产品检验标准
- ASME B16.5-16.47法兰尺寸对照表
- 门卫保安反恐演练方案
- GB/T 6109.2-2008漆包圆绕组线第2部分:155级聚酯漆包铜圆线
评论
0/150
提交评论