Top Banner
12 12 C C 目目目目目目目目目 目目目目目目目目目 第 12 第 12.1 C 目目目目目目目 12.2 目目目目 12.3 目目目目 12.4 目目目目
44

第 12 章 文 件

Jan 15, 2016

Download

Documents

Sef

第 12 章 文 件. 12.1 C 文件的基础知识 12.2 文件指针 12.3 文件操作 12.4 应用实例. 12.1 C 文件的基础知识. 12.1.1 文件的概念 12.1.2 C 文件操作的基本方法. 12.1.1 文件的概念. 所谓 “ 文件 ” 一般指 存储在外部介质上数据的集合 。一批数据是以文件形式存放在外部介质上的。 C 语言把文件看作是一个字符(字节)的序列,即由一个一个 字符(字节)的数据顺序组成 。 根据数据的组织形式,可分为 ASCII 文件 和 二进制文件 ,如下图所示。. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

第 12 章 文 件

12.1 C文件的基础知识

12.2 文件指针

12.3 文件操作

12.4 应用实例

Page 2: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.1 C 文件的基础知识

12.1.1 文件的概念

12.1.2 C 文件操作的基本方法

Page 3: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.1.1 文件的概念 所谓“文件”一般指存储在外部介质上数据的集合。一批数据是以文件形式存放在外部介质上的。

C 语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。

根据数据的组织形式,可分为 ASCII 文件和二进制文件,如下图所示。

Page 4: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.1.1 文件的概念

ASCII 文件:又称文本文件,它的每一个字节放一个 ASCII 代码,代表一个字符。 二进制文件:是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。 流文件:一个 C 文件就是一个字节流或二进制流。输入输出的数据流的开始和结束仅受程序控制而不受物理符号(如回车)控制。把这种文件称为“流文件”。缓冲文件系统:系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。

Page 5: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.1.2 C 文件操作的基本方法 在 Turbo C 2.0 中,文件操作常用函数如下表所示。

格式 功能fputc (字符,文件指针) 把一个字符写到指定文本文件上fgetc (文件指针) 从指定文本文件读取一个字符fgets (传始地址,字符数 +1 ,文件指针) 从指定文件读取字符串fputs (传始地址,文件指针) 把字符串写入指定文件fwrite (始地址,字节数,个数,文件指针)

一般用于二进制文件输出fread (始地址,字节数,个数,文件指针)

一般用于二进制文件输入fprintf (文件指针,格式字符串,输出表列)

类似 printf ()函数,但向指定文件输出fscanf (文件指针,格式字符串,输出表

列)类似 scanf ()函数,但向指定文件读取feof (文件指针) 判断文件结束

fopen (文件名,文件打开方式) 打开文件fclose (文件指针) 关闭文件fseek (文件名,位移量,起点) 文件定位ftell (文件指针) 获取文件当前位置指针的位置rewind (文件指针) 文件的位置指针回到文件头

Page 6: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.2 文件指针

一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。

定义说明文件指针的一般形式为:

FILE * 指针变量标识符

其中 FILE 应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。

Page 7: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3 文件操作

12.3.1 文件打开

12.3.2 文件关闭

12.3.3 读、写文件

12.3.4 文件定位

12.3.5 出错检测

Page 8: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.1 文件打开

所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其他操作。 fopen 函数用来打开一个文件,其调用的一般形式为:

文件指针名 =fopen (文件名,文件打开方式)

其中:“ 文件指针名”必须是被说明为 FILE 类型的

指针变量。“ 文件名”是被打开文件的文件名。“ 文件打开方式”是指文件的类型和操作要求。

Page 9: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.1 文件打开使用文件的方式共有 12 种,它们的符号和意

义如下表所示。文件使用方式 意义

“rt” 只读打开一个文本文件,只允许读数据“wt” 只写打开或建立一个文本文件,只允许写数据“at” 追加打开一个文本文件,并在文件末尾写数据“rb” 只读打开一个二进制文件,只允许读数据“wb” 只写打开或建立一个二进制文件,只允许写数据“ab” 追加打开一个二进制文件,并在文件末尾写数据“rt+” 读写打开一个文本文件,允许读和写“wt+” 读写打开或建立一个文本文件,允许读写“at+” 读写打开一个文本文件,允许读,或在文件末追加数据“rb+” 读写打开一个二进制文件,允许读和写“wb+” 读写打开或建立一个二进制文件,允许读和写“ab+” 读写打开一个二进制文件,允许读,或在文件末追加数据

Page 10: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.1 文件打开对于文件使用方式有以下几点说明:

( 1 )文件使用方式由“ r 、 w 、 a 、 t 、 b 、 + ” 六个字符拼成,各字符的含义是:r ( read ):读。w ( write ):写。a ( append ):追加。t ( text ):文本文件,可省略不写。b ( binary ):二进制文件。+ :读和写。( 2 )凡用“ r” 打开一个文件时,该文件必须已经存在,且只能从该文件读出。( 3 )用“ w” 打开的文件只能向该文件写入。

Page 11: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.1 文件打开

( 4 )若要向一个已存在的文件追加新的信息,只能用“ a” 方式打开文件。

( 5 )在打开一个文件时,如果出错, fopen将返回一个空指针值NULL 。

( 6)把一个文本文件读入内存时,要将 ASCII 码转换成二进制码,而把文件以文本方式写入磁盘时,也要把二进制码转换成 ASCII 码。

( 7)标准输入文件(键盘),标准输出文件(显示器),标准出错输出(出错信息)是由系统打开的,可直接使用。

Page 12: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.2 文件关闭

文件一旦使用完毕,应用关闭文件函数把文件关闭,以避免文件的数据丢失等错误。

fclose 函数调用的一般形式是:

fclose (文件指针) ;

正常完成关闭文件操作时, fclose 函数返回值为 0 。如返回非零值则表示有错误发生。

Page 13: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件 1. 读字符函数 fgetc

fgetc函数的功能是从指定的文件中读一个字符,函数调用的形式为:

字符变量 =fgetc (文件指针) ; 对于 fgetc函数的使用有以下几点说明:

( 1 )在 fgetc函数调用中,读取的文件必须是以读或读写方式打开的。

( 2 )读取字符的结果也可以不向字符变量赋

( 3 )在文件内部有一个位置指针。用来指向文件的当前读写字节。

Page 14: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件

2. 写字符函数 fputc

fputc函数的功能是把一个字符写入指定的文件中,函数调用的形式为:

fputc (字符量,文件指针) ;

其中,待写入的字符量可以是字符常量或变量。

Page 15: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件 【例 12-2】从键盘输入一行字符,写入一个文件,再把该文件内容读出显示在屏幕上。#include<stdio.h>main(){ FILE *fp; /*定义文件指针 fp*/ char ch; /*以读写文本文件方式打开文件 */ if((fp=fopen("d:\\tc2\\string.txt","wt+"))==NULL) { printf("Cannot open file strike any key exit!"); getch(); exit(1); }

Page 16: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件 printf("input a string:\n"); ch=getchar(); /*读入一个字符后进入循环 */ while (ch!='\n') { fputc(ch,fp); /*当读入字符不为回车符时,

则把该字符写入文件之中 */ ch=getchar(); } rewind(fp); /*用于把 fp 所指文件的内部位

置指针移到文件头 */ ch=fgetc(fp); /*读出文件中的一行内容 */ while(ch!=EOF)

Page 17: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件 { putchar(ch); ch=fgetc(fp); } printf("\n"); fclose(fp); /* 关闭文件 */}

【例 12-2】程序运行结果如下图所示。

Page 18: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件

函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为:

fgets (字符数组名, n ,文件指针) ; 其中的 n 是一个正整数。表示从文件中读出

的字符串不超过 n-1 个字符。在读入的最后一个字符后加上串结束标志“ \0” 。

( 2 ) fgets函数也有返回值,其返回值是字符数组的首地址。

对 fgets函数有两点说明:( 1 )在读出 n-1 个字符之前,如遇到了换行符或 EOF ,则读出结束。

3. 读字符串函数 fgets

Page 19: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件 【例 12-4】从 string.txt 文件中读入一个含 10

个字符的字符串。#include<stdio.h>main(){ FILE *fp; char str[11]; /*以读文本文件方式打开文件 */ if((fp=fopen("d:\\tc2\\string.txt","rt"))==NULL) { printf("\nCannot open file strike any key exit!"); getch(); exit(1); }

Page 20: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件 fgets(str,11,fp); /*读出 10 个字符

送入 str 数组 */

printf("\n%s\n",str); /*输出 str 数组 */

fclose(fp); /*关闭文件 */

}

【例 12-4】程序运行结果如下图所示。

Page 21: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件

4. 写字符串函数 fputs

fputs函数的功能是向指定的文件写入一个字符串,其调用形式为:

fputs (字符串,文件指针) ;

其中字符串可以是字符串常量,也可以是字符数组名,或指针变量。

Page 22: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件 5. 整块数据的读写函数

读数据块函数调用的一般形式为:fread ( buffer , size , count , fp ) ;

写数据块函数调用的一般形式为:fwrite ( buffer , size , count , fp ) ;

其中:buffer :是一个指针,在 fread 函数中,它表示存放输入数据的首地址。在 fwrite 函数中,它表示存放输出数据的首地址。size :表示数据块的字节数。Count :表示要读写的数据块块数。Fp :表示文件指针。

Page 23: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件

6. fscanf 、 fprintf 函数

格式化读写函数。 fscanf 函数和 fprintf 函数的读写对象不是键盘和显示器,而是磁盘文件。

这两个函数的调用格式为: fscanf( 文件指针 , 格式字符串 , 输入

表列 );

fprintf(文件指针 ,格式字符串 ,输出表列 );

Page 24: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件

【例 12-7 】用 fscanf 和 fprintf 函数成例 12-6的问题。#include<stdio.h>struct stu /*定义一个结构 stu*/{ char name[10]; int num; int age; char addr[15];}boya[2],boyb[2],*pp,*qq; /* 说明两个结构数组

以 及两个结构指针变量*/

Page 25: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件 main(){ FILE *fp; char ch; int i; pp=boya; /* pp 指向 boya,qq指向 boyb */ qq=boyb; if((fp=fopen("stu_list","wb+"))==NULL)

/*以读写方式打开二进制文件 */ { printf("Cannot open file strike any key exit!"); getch(); exit(1); }

Page 26: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件

printf("\ninput data\n");

for(i=0;i<2;i++,pp++)

scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);

pp=boya;

for(i=0;i<2;i++,pp++)

fprintf(fp,"%s %d %d %s\n",pp->name,pp->num,pp->age,pp->addr);

rewind(fp); /*把文件内部位置指针移到文件首 */

for(i=0;i<2;i++,qq++)

Page 27: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件

fscanf(fp,"%s %d %d %s\n",qq->name,&qq->num,&qq->age,qq->addr); /*写入该文件 */

printf("\n\nname\tnumber age addr\n"); qq=boyb;

for(i=0;i<2;i++,qq++)

printf("%s\t%5d %7d %s\n",qq->name,qq->num, qq->age,

qq->addr);

fclose(fp);

}

Page 28: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.3 读、写文件

【例 12-7 】程序运行结果如下图所示。

Page 29: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.4 文件定位

实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。移动文件内部位置指针的函数主要有两个,即 rewind 函数和 fseek函数。

rewind 函数的调用形式为:

rewind( 文件指针 );

它的功能是把文件内部的位置指针移到文件首。

Page 30: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.4 文件定位 fseek函数用来移动文件内部位置指针,其

调用形式为:fseek(文件指针 ,位移量 ,起始点 );

其中:“ 文件指针”指向被移动的文件。

起始点 表示符号 数字表示

文件首 SEEK_SET 0

当前位置 SEEK_CUR 1

文件末尾 SEEK_END 2

“ 位移量”表示移动的字节数。当用常量表示位移量时,要求加后缀“ L” 。“ 起始点”表示从何处开始计算位移量,其表示方法如下表所示。

Page 31: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.5 出错检测 1. 文件结束检测函数 feof

feof 调用格式:feof( 文件指针 );

功能:判断文件是否处于文件结束位置,如文件结束,则返回值为 1 ,否则为 0 。2. 读写文件出错检测函数

ferror 函数调用格式:ferror( 文件指针 );

功能:检查文件在用各种输入输出函数进行读写时是否出错。如 ferror返回值为 0 表示未出错,否则表示有错。

Page 32: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.3.5 出错检测

3. 文件出错标志和文件结束标志置 0 函数

clearerr 函数调用格式:

clearerr( 文件指针 );

功能:本函数用于清除出错标志和文件结束标志,使它们为 0值。

Page 33: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.4 应用实例

【例 12-9 】从键盘输入一些字符,逐个把它们送到磁盘上,直到输入一个“#”为止。#include < stdio.h >

main()

{FILE *fp; /*定义文件指针 fp*/

char ch,filename[10];

scanf("%s",filename);

if((fp=fopen(filename,“w”))==NULL) /* 打 开文件 */

{printf("cannot open file\n");

Page 34: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.4 应用实例 exit(0);

}

ch=getchar(); /*先读入一个字符 */

while(ch!='#')

{

fputc(ch,fp),putchar(ch); /* 把读入的字符写入文件 *

/

ch=getchar();

}

fclose(fp);

}

Page 35: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.4 应用实例

【例 12-9 】程序运行结果如下图所示。

Page 36: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.4 应用实例 【例 12-10】将一个磁盘文件中的信息复制到另一个磁盘文件中。#include < stdio.h >main(){FILE *in,*out; /*定义文件指针 */ char ch,infile[10],outfile[10]; printf("Enter the infile name:\n"); scanf("%s",infile); printf("Enter the outfile name:\n"); scanf("%s",outfile); if((in=fopen(infile,“r”))==NULL) /*打开文件 */

Page 37: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.4 应用实例 {printf("cannot open infile\n"); exit(0); } if((out=fopen(outfile,“w”))==NULL) /* 打 开

文件 */ {printf("cannot open outfile\n"); exit(0); } while(!feof(in))fputc(fgetc(in),out); /* 复制

文件信息 */ fclose(in); fclose(out);}

Page 38: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.4 应用实例

【例 12-10】程序运行结果如下图所示。

Page 39: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.4 应用实例 【例 12-11】输入 10 个学生的数据。要求将第1 、 3 、 5 、 7、 9个学生数据输出到计算机。#include <stdio.h>#include <conio.h>struct stu /*定义一个结构 stu*/{ char name[10]; int num; int age; char sex;

}boya[2],boyb[10],*pp,*qq; /* 说 明两个 结 构数组以及两个结构指针变量 */

Page 40: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.4 应用实例

main(){FILE *fp; char ch; int i; clrscr(); pp=boya; /* pp 指向 boya,qq指向 boyb */ qq=boyb; /*以读写方式打开二进制文件 */ if((fp=fopen("e:\\tc2\\stu_dat","wb+"))==NULL) {

printf("Cannot open file strike any key exit!");

Page 41: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.4 应用实例

getch();

exit(1);

}

printf("\ninput data\n");

for(i=0;i<10;i++,pp++)

scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->sex);

pp=boya;

fwrite(pp,sizeof(struct stu),2,fp); /*写入该文件 */

rewind(fp); /*把文件内部位置指针移到文件首 */

Page 42: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.4 应用实例

fread(qq,sizeof(struct stu),10,fp); /*读出两个学生数据后,在屏幕上显示 */ printf("\n\nname\tnumber age sex\n");

for(i=0;i<10;i+=2,qq+=2)

printf("%s\t%5d%7d %s\n",qq->name,qq->num,qq->age,qq->sex);

fclose(fp);

getch();

}

Page 43: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页

12.4 应用实例 【例 12-11】程序运行结果如下图所示。

Page 44: 第 12 章  文    件

目 录

下一页

退 出

第第 1212章章

CC语言程序设计及应用语言程序设计及应用

上一页 bye