程序设计-第8章+数据文件处理技术
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3
二进制文件
把内存中的数据按原样存储在文件中。存储数值数据 只占其内部表示所需的字节数。用二进制形式存储数 值数据可以节省外存空间,并免去数据内外表示形式 之间的转换。中间结果或程序与程序之间传递的数据 常用二进制文件保存。 例如:整数10000 在内存中用2个字节表示,保存到正 文文件中要占5个字节;保存到二进制文件中只占2个 字节。
20
字符读/写函数
读字符函数fgetc() 调用形式: fgetc(fp); 功能:从与fp指针相联系的文件中读入下一个字符。 返回值:成功,返回读入字符的ASCII代码值;出错或 遇文件结束,返回EOF(定义为-1)。
写字符函数fputc() 调用形式:fputc(ch,fp); 功能:将ch中的字符输出到与fp指针相联系的文件中。 返回值:成功,返回输出字符的ASCII代码值;否则返 回EOF(定义为-1)。
return; }
代码的意义是:在调用函数fopen()后立即检查 打开是否成功,如果打开不成功,就输出该文 件不能打开后返回。
14
文件名
文件名为字符串表达式,可包括目录路径,可以是 字符串常量,也可以是字符指针、字符数组等。
fopen(“ascii.txt”,”r”); fopen(“d:\\joe\\ascii.txt”,”r”); char *file_name=“ascii.txt”; fopen(file_name,”r”); char filename[20]; strcpy(file_name,”ascii.txt”); fopen(file_name,”r”);
18
文件关闭库函数fclose
格式:fclose (文件指针); 例如:fclose (fp); 作用:使文件指针变量终止原先调用函数 fopen( ) 时所建立的与文件的联系。即将文件指针fp指向的文 件结构释放,并释放文件缓冲区,成功返回0,失败 返回EOF(-1)。 说明:文件操作后必须关闭,可避免程序被强制结束 时,暂留在缓冲区内数据的丢失
"a+"
读写,为读/写打开正文文件
"rb+"或"r+b" 读写,为读/写打开二进制文件
"wb+"或"w+b" 读写,为读/写建立并打开新的二进制文件
"ab+"或"a+b" 读写,为读/写打开二进制文件 16
文件使用方式的说明
1. 用 "r" 方式打开的文件只能用于从文件输 入数据,而且要求文件存在。
24
文件测试函数
feof()
调用形式: feof(fp); 功能:测试与fp相联系的文件当前状态是否为“文件
结束”状态。 返回值:文件结束返回非零值,否则零值。
25
字符行读写函数
读字符行函数fgets()
调用形式:fgets(str, n, fp); 功能:从与fp相联系的文件中读入多至n-1个字符,存于字符指针str 所指的存储区域中,并自动存储字符串结束标志‘\0’,使其成为字 符串。 返回值:返回字符串的首字符指针,出错或遇文件尾,则返回NULL。 例如(将文件内容一行一行地输入): char a[80]; FILE *in; while ( !feof(in))
表 示 : 以 读 方 式 打 开 根 目 录 下 的 usr4 子 目 录 中 的 smp.dat 文件。
13
文件打开出错处理
考虑到文件不能正常打开的极端情况,所 以常用以下形式的C代码描述打开文件:
if (( fp = fopen(filename, "r")) == NULL)
{ printf(“Can not open %sfile.\n”,filename);
形式:fopen(file,mode);
其中:文件名为字符串表达式。
使用方式:指明文件的读写方式(见表8-1)。
功能:将名为file的文件按mode方式打开,成功则返回
一个指向存放文件控制信息结构 的指针,失败则返
回NULL。
第1个\为 转义字符
例如:fp = fopen("\\usr4\\smp.dat", "r");
printf ("%s", fgets (a, 80, in));
26
写字符行函数fputs() 调用形式:fputs(str, fp); 功能:将str所指的字符串复制到与fp相联系的文 件中,不复制字符串结束标志。 返回值:返回最后输出的字符,出错则返回EOF。
例如:fputs ("China", fp); 表示:将字符串 "China" 输出到 fp 指向的文件。
程序写信息到文件时,也先把信息写到缓冲区中, 待缓冲区写满或写文件结束时,把缓冲区中的内容写 到文件中。 程序要读写文件中的数据,首先打开要读写的文件(写 文件时可能要新建文件),然后才能对该文件读写数据, 并在使用结束时关闭文件。
7
文件类型 FILE
操作系统除为文件开辟缓冲区外,还为每 个被使用的文件在内存中开辟另一个存储区, 用于存放有关对文件进行操作所需的控制信息。 例如,文件名、文件读写状态、文件缓冲区大 小和位置、当前读写位置等。
• 作用:文本文件方便人阅读;二进制文件不便阅读,主 要用于程序之间、程序与设备之间成批数据信息的传递。
5
程序与文件交换数据的实现过程
操作系统为能高效地管理和控制设备,给程序正在 使用的每个文件在内存中开辟一个适当大小的缓冲区。
输出文件 缓冲区
程序数据区
文件
Memory
输入文件 缓冲区
6
程序从文件读入信息时,系统先一次性地读入足够 多的信息存于缓冲区中,供程序一部分一部分地使用。
}
输入文件名:
d:\file1.txt
开始输入字符串:
Fudan University.
Shanghai, China.#
22
【例2】将一个文件中的数据复制到另一个文件中。 #include <stdio.h> void main() { FILE *in, *out; char ch, infile[40], outfile[40]; printf ("输入源文件名:"); gets(infile);/*或scanf("%s%*c",infile); */ if (( in = fopen(infile, "r")) == NULL) { printf ("不能打开源文件 %s\n", infile); scanf ("%*c"); /* 起暂停作用 */ return; }
19
文件处理
常用文件处理库函数
文件读写 字符读/写函数:fgetc(),fputc() 字符行读/写函数:fgets(),fputs() 格式读/写函数:fscanf(),fprintf() 成批读/写函数:fread(),fwrite()
文件测试 feof()
文件定位 rewind(),fseek(),ftell()
fflush (stdin); /* 清输入缓冲区 */
printf ("开始输入字符串: \n");
ch = fgetc(stdin);
while (ch != '#') {
fputc (ch, fp); ch = fgetc(stdin);
}
fclose (fp); /* 关闭文件 */ 运行情况如下:
00100111 00010000
4
文本文件与二进制文件的区别
• 数据流:文本文件由一个个字符组成;二进制文件由二 进制字节代码组成。
• 存储方式:文本文件的每个字符以ASCII代码存储 ;二 进制文件把数据按其在内存中的存储形式存储 。
• 存储空间:文本文件所占的存储空间较多,内外存的存 储形式不一致,输入输出时需进行表示形式的转换; 二进制文件可节省外存空间,并免去内外表示形式的 转换。
9
文件类型指针变量
程序在使用文件前,先调用打开函数。打开函数 为文件指定一个FILE类型的结构,并返回该结构的指 针。系统通过指向该结构的指针才能正确读写文件。
程序要使用文件,就要定义FILE类型的指针变量 (称为文件指针变量)。 例如:FILE *fp;
有了文件指针变量,使得C程序能找到与它对应 的文件。在程序中若要访问n个文件,一般应设n个文 件指针变量。
23
printf ("输入目标文件名: "); gets (outfile); out = fopen(outfile,"w"); while (( ch = fgetc(in)) != EOF)
fputc (ch, out); fclose (in); fclose (out); }
运行情况如下: 输入源文件名: d:\file1.txt 输入目标文件名: d:\file2.txt
10
标准文件操作的四个基本步骤: 1. 文件类型指针的定义 2. 打开标准文件 3. 标准文件的读或写的操作 4. 标准文件的关闭操作
11
定义文件类型指针 指针定义
文
件
的 操
打开文件
文件打开函数
作
步
骤
对文件进行读或写 文件读写函数
关闭文件
文件关闭函数
12
8.2 几个常用的数据文件库函数
文件打开库函数 fopen( )
文件概述
文件: 存储在计算机 外部存储介质 上的数据信息 集合。
文件组织和存取:
给文件命名,并将
它挂在呈层次状的
目录结构下。
一个文件目录结构示意图
2
根据数据的组织形式,文件分为两种:
正文文件
二进制文件
正文文件
文件中数据是字符,每个字符以代码存储(例如 ASCII代码),占一个字节。存储数值数据要占较多 的存储空间,有时还要进行内外表示形式之间的转 换。数值10000的文本文件表示:
C系统将这些信息存储在一个结构变量中, 这种结构的类型由系统预定义,取名FILE,称 文件类型其定义包含在头文件stdio.h中,
格式如下:
8
typedef struct { short level; /* 缓冲区“满”或“空”的标志 */ unsigned flags; /* 文件状态标志 */ char fd; /* 文件描述符 */ unsigned char hold; /* 若无缓冲区不读取字符 */ short bsize; /* 缓冲区的大小 */ unsigned char *buffer; /* 数据缓冲区的位置 */ unsigned char *curp; /* 当前活动指针 */ unsigned istemp; /* 临时文件描述符 */ short token; /* 用于有效性检查 */ }FILE;
第8章 数据文件处理技术
本章学习的目标是: 1、了解数据输入输出过程; 2、掌握文件类型和文件指针变量的概念和使用方法; 3、掌握常用文件库函数的使用方法; 4、掌握字符(字节)逐一输入、输出的处理程序结构; 5、了解数据成批输入、输出的处理程序结构; 6、能编写简单的文件应用程序。
1
8.1 文件类型和文件类型指针变量
2. 用 "w" 方式打开的文件只能用于向文件输 出数据。如打开时,文件不存在,则新建 一个以指定名字命名的文件;如原文件已 存在,则原文件上的数据被全部删除。
3. 用 "a" 方式打开文件,不删除原文件中的 数据,从原文件的末尾开始添加新数据。
4. 用 "r+"、"w+"、"a+" 方式,可以输入和
输出。
17
5. 要打开二进制文件,只要在对应打开方式中 接上字符 b 即可,如:"rb" 表示以输入方 式打开二进制文件。
6. 对于正文文件,输入时,回车符和换行符合 成为一个换行符输入;输出时,换行符 (’\n’)转换成为回车符和换行符两个字符 一起输出。对于二进制文件,不进行上述这 种转换,二进制文件中的数据形式与在内存 中的数据形式是完全一致的。
21
【例1】从键盘上输入字符,依次送入指定的文件, 直到输入一个"#"为止。
#include <stdio.h>
void main()
{ FILE *fp;
char ch, fname[40];
printf("输入文件名: "); scanf("%s", fname);
fp = fopen(fname, "w");
15
表8-1Fra Baidu bibliotek文件使用方式
文件使用方式
意义
"r"
只读,为读打开正文文件
"w"
只写,为写打开正文文件
"a"
追加,从正文文件尾开始写
"rb"
只读,为读打开二进制文件
"wb"
只写,为写打开二进制文件
"ab"
追加,从二进制文件尾开始写
"r+"
读写,为读/写打开正文文件
"w+"
读写,为读/写建立并打开新的正文文件