第 13章 文件
22:55 1
第十三章 文件主讲 福州大学数学与计算机学院 韩晓芸
E-mail,hxy@fjtv.net
第 13章 文件
22:55 2
第一节 文件概述
第二节 文件的使用
第三节 文件的读写
第四节 文件的定位
第五节 文件出错检测
第六节 操作系统级的文件
第七节 文件输入输出小结第 13章 文件
22:55 3
第一节 文件概述
文件概念
数据文件存放形式
缓冲文件系统与非缓冲文件系统第 13章 文件
22:55 4
数据文件文件,是指存储在外部介质上以一定名字命名的数据集合。 包含程序文件和数据文件 。
数据文件,用来存储程序运行需要输入的数据、运算的中间结果和最终结果。
按名存取:
第 13章 文件
22:55 5
数据文件存放形式
ASCII文件,它的 每个字节存放一个 ASCII代码,代表一个字符。
二进制文件,把内存中的数据 按照其在内存中的存储形式原样 输出到磁盘上存放。
ASCII码(文本文件)、二进制文件第 13章 文件
22:55 6
00110000 00111001
二进制文件
00110001 00110010 00110011 00110100 00110101
ASCII码文件例如:一个十进制数 12345
00110000 00111001
内存第 13章 文件
22:55 7
缓冲文件系统缓冲文件系统,系统自动地在内存区为每个正在使用的文件开辟一个缓冲区,从内存向磁盘输出数据必须先送到内存的缓冲区,装满缓冲区后才一起送到磁盘 。 反过来,从磁盘向内存读入数据,则依次从磁盘文件将一批数据读到缓冲区,充满后再从缓冲区逐个将数据送到程序数据区。
第 13章 文件
22:55 8
缓冲文件系统示意图内 存写盘读盘输出程序数据区缓冲区缓冲区磁盘输 入第 13章 文件
22:55 9
第二节 文件的使用
文件类型 FILE
文件指针 FILE *fp;
文件的打开和关闭第 13章 文件
22:55 10
文件类型在 stdio.h文件中定义 FILE:
typedef struct
{int _fd; 文件号
int _cleft; 缓冲区中剩下的字符
int _mode; 文件操作的模式
char *_nextc;下一个字符的位置
char *_buff; 文件缓冲区的位置
}FILE;
第 13章 文件
22:55 11
文件指针
FILE *fp;
fp--指向 FILE类型结构体的指针变量 。通过文件指针变量 fp可以引用 fp指向的文件。
第 13章 文件
22:55 12
文件的打开和关闭
1,文件的打开 ——fopen( )函数
FILE *fp;
fp=fopen(文件名,使用文件方式 )
例如:
fp=fopen(“file1.dat”,“r”)
打开一个文件时要向编译系统提供三个信息:
–要打开的文件名
–打开方式
–指向文件的指针第 13章 文件
22:55 13
文件使用方式 意义
r 只读,为读文件打开一个文本文件
w 只写,为写文件打开一个文本文件
a 追加,向文本文件尾部追加数据
rb 只读,为读文件打开一个二进制文件
wb 只写,为写文件打开一个二进制文件
ab 追加,向二进制文件尾部追加数据
r+ 读 / 写,为读 / 写文件打开一个文本文件
w+ 读 / 写,为读 / 写文件建立并打开一个新的文本文件
a+ 读 / 写,为读 / 写文件打开一个文本文件
rb+ 或 r+b 读 / 写,为读 / 写文件打开一个二进制文件
wb+ 或 w+b 读 / 写,为读 / 写文件建立并打开一个新的二进制文件
ab+ 或 a+b 读 / 写,为读 / 写文件打开一个二进制文件文件的使用方式第 13章 文件
22:55 14
说明:
(1) 用 r (只读 )方式打开的文件 只能用于程序从文件输入数据,不能向文件输出数据,而且要求该文件已经存在,否则函数 fopen( )将返回空指针 NULL。
(2) 用 w(只写 )方式打开的文件 只能用于向文件输出数据,不能从该文件中输入数据,如果打开时原文件不存在,则新建该文件,如果原文件已经存在,则删除原文件里的数据 。
第 13章 文件
22:55 15
说明:
(3) 用 a(追加 )方式打开的文件,表示不删除原文件里的数据,而是从文件的末尾开始添加数据,要求被打开的文件已经存在,打开后,文件的位置指针将定位在文件的尾部,如果要打开的文件不存在,则函数 fopen( )返回一个空指针 NULL。
第 13章 文件
22:55 16
(4) 用 r+,w+,a+(读 /写 )方式打开的文件,既可以从文件输入数据,也可以向文件输出数据,
其中 r+只 允许打开已存在的文本文件,用 w+方式打开,则系统新建一个文件,先向文件输出数据,然后才能从文件输入数据 。 用 a+方式 是打开已经存在的文件,并且文件的位置指针定位在文件的末尾,先准备向文件添加数据,以后也可以从文件输入数据 。
第 13章 文件
22:55 17
(5) 上述打开的文件都是针对文本文件,如果 要打开二进制文件,必须在使用方式面添上字符 b,如 rb表 示以只读方式打开一个二进制文件 。
第 13章 文件
22:55 18
(6) 调用函数 fopen( )时,可能因某种原因不能正常打开指定的文件,则函数将返回一个空指针 NULL
( NULL在,stdio.h”文件中被定义为 0) 。 我们常用以下语句来打开某个文件:
if((fp=fopen(“file”,“r”))==NULL)
{printf(“Can’t open this file! \n”);
exit(0);}
函数 exit( )的 作用是关闭所有的文件,终止正在调用的过程,用此函数应当加 stdlib.h头文件 。
第 13章 文件
22:55 19
(7) 在程序开始运行时,系统将自动打开三个标准文件,标准输入,标准输出和标准出错输出 。 通常这三个文件都和终端相联系,系统自动定义了三个文件指针 stdin,stdout和 stderr,分别指向终端输入,终端输出和标准出错输出,一般从终端输入即从键盘输入,向终端输出即向显示器输出 。 标准出错输出也是向显示器输出 。
第 13章 文件
22:55 20
程序运行时系统自动打开标准文件:
标准输入标准输出标准出错输出系统自动定义文件指针:
stdin
stdout
stderr
第 13章 文件
22:55 21
2.文件的关闭 —fclose( )函数
fclose(文件指针 )
例如,fclose(fp);
返回值为 0--顺利执行关闭操作返回值非 0--执行关闭操作有错第 13章 文件
22:55 22
第三节 文件的读写
读写一个字符的函数
— fgetc( )和 fputc( )
读写数据块的函数
— fread( )和 fwrite( )
格式化读写函数
— fscanf( )和 fprintf( )
其它读写函数第 13章 文件
22:55 23
读写一个字符的函数
— fgetc( )和 fputc( )
1,fgetc( )函数说明形式,int fgetc(FILE *fp);
功能,从 fp所指向的文件读入一个字符,函数的返回值就是它读入的字符,读入时如果遇到结束符,则函数返回 文件结束标记 EOF
( stdio.h中定义的符号常量,值为 -1)。
第 13章 文件
22:55 24
读写一个字符的函数
— fgetc( )和 fputc( )
例如,想从磁盘 文本文件 顺序读入字符并输出到屏幕上,可以,ch=fgetc(fp);
while(ch!=EOF)
{putchar(ch); ch=fgetc(fp);}
feof(fp)函数 --判断文件是否结束。
例如,想从磁盘 二进制文件 顺序读入数据,可以:
while(!feof(fp))
{c=fgetc(fp);,..}
第 13章 文件
22:55 25
2,fputc( )函数说明语句,int fputc(char ch,FILE *fp);
功能,把一个字符 ch写到 fp所指向的 磁盘文件上。输出成功返回值就是输出的字符,如果失败,则返回 EOF。
读写一个字符的函数
— fgetc( )和 fputc( )
第 13章 文件
22:55 26
例 1,读入 file1.dat文本文件 中的字符,然后依次输出到显示器 。
main( )
{char c; FILE *fp;
if(( fp=fopen("file1.dat","r"))==NULL)
{printf("Can’t open this file! \n"); exit(0);}
while((c=fgetc(fp))!=EOF)
printf("%c",c);}
文件尾第 13章 文件
22:55 27
例 2,读入 file2.dat二进制文件 中的数据,然后依次输出 到显示器。
main( )
{ char c; FILE *fp;
if ((fp=fopen(“file2.dat”,“rb”))==NULL)
{printf(“Can’t open this file! \n”);
exit(0); }
while(!feof(fp))
{c=fgetc(fp); printf(“%c”,c); }}
文件尾第 13章 文件
22:55 28
例 3,将键盘上输入的字符串写入到文本文件
file3.dat中。
main( )
{char ch[80];int i=0; FILE *fp;
if((fp=fopen("file3.dat","w"))==NULL)
{printf("Can’t open this file!\n");
exit(0);}
scanf("%s",ch);
while(ch[i]!=’\0’)
{fputc(ch[i],fp);i++;}
}
abcdefgh
键盘输入第 13章 文件
22:55 29
例 4,将一个磁盘文件中的信息复制到另一个磁盘文件中 。
#include "stdio.h"
main( )
{FILE *in,*out;
char ch,infile[15],outfile[15];
printf("请输入读入信息的文件名,\n");
scanf("%s",infile);
printf("请输入输出信息的文件名,\n");
scanf("%s",outfile );
第 13章 文件
22:55 30
if((in=fopen(infile," r"))==NULL)
{printf("Can’t open infile\n"); exit(0);}
if((out=fopen(outfile,"w"))==NULL)
{printf("Can’t open outfile\n");exit(0);}
while(!feof(in))
{ch=fgetc(in);fputc(ch,out);}
fclose(in);fclose(out);}
infile 内存单元 outfile
r w
第 13章 文件
22:55 31
程序运行情况:
请输入读入信息的文件名,file.dat
请输入输出信息的文件名,copyfile.dat
c:\>type file.dat
basic,fortran and c
computer
c:>type copyfile.dat
basic,fortran and c
computer
验证第 13章 文件
22:55 32
读写数据块的函数
—— fread( )和 fwrite( )
1.fread( )函数
int fread(char *buffer,
int size,int count,FILE *fp)
2.fwrite( )函数
int fwrite(char *buffer,
int size,int count,FILE *fp)
第 13章 文件
22:55 33
buffer,存放读 /写数据的起始地址。
size,读 /写字节数。
count,读 /写 size字节的数据项。
fp,文件型指针。
函数调用成功:返回 count的值。
当以 二进制形式 打开文件时,函数可以读写任何类型的信息。
说明:
第 13章 文件
22:55 34
例 5,从键盘输入 10个学生的学号、姓名、年龄和地址的有关数据,然后把它们存储到磁盘文件 stu.dat。程序如下:
#include "stdio.h"
#define SIZE 10
struct student
{long num;char name[10];int age;
char addr[40];}stud[SIZE];
第 13章 文件
22:55 35
main( )
{int i;
for(i=0;i<SIZE;i++)
scanf("%ld%s%d%s",
&stud[i].num,
stud[i].name,
&stud[i].age,
stud[i].addr );
save( );}
1001 张 梨 17 301室
1002 李建平 18 302室
1003 唐琴利 19 107室
1004 林 茹 20 504室
1005 汪奇才 16 101室
1006 樊 洋 18 102室
1007 吴 语 19 303室
1008 冯 挺 20 103室
1009 李 萱 17 102室
1010 蔡 虹 18 104室输入,
第 13章 文件
22:55 36
stu.dat
1001 张梨 17 301室
void save( )
{FILE *fp;int i;
if((fp=fopen("stu.dat","wb"))==NULL)
{printf("Can’t open this file!\n");
exit(0);}
for(i=0;i<SIZE;i++)
if(fwrite(&stud[i],sizeof(struct student),
1,fp)!=1)
printf("File write error!\n");
fclose(fp);}
第 13章 文件
22:55 37
格式化读写函数
— fscanf( )和 fprintf( )
1,fscanf( ) 函数
fscanf(文件指针,格式字符串,输入地址表列 )
例,fscanf(fp,“%d,%f”,&i,&f);
2,fprintf( ) 函数
fprintf(文件指针,格式字符串,输出表列 )
例,fprintf(fp,“%3d,%6.1f”,i,f);
第 13章 文件
22:55 38
例 6,从键盘输入 10个学生的姓名和三门课程的成绩,并计算出每个人的平均成绩,然后将所有数据存放到文本文件 st.dat中 。 程序如下:
#include "stdio.h"
#define NO 10
struct student
{char name[9];
int score[3];
float ave;}stud[NO];
第 13章 文件
22:55 39
main( )
{int i,j,sum; FILE *fp;
if((fp=fopen("st.dat","wb"))==NULL)
{printf("Can’t open thisfile!\n");
exit(0); }
for(i=0;i<NO;i++)
{scanf("%s",stud[i].name);
sum=0;
for(j=0;j<3;j++)
{scanf("%d",&stud[i].score[j]);
sum+=stud[i].score[j];}
stud[i].ave=sum/3.0;}
第 13章 文件
22:55 40
for(i=0;i<NO;i++)
fprintf(fp,"%s %d %d %d%5.1f",
stud[i].name,stud[i].score[0],
stud[i].score[1],stud[i].score[2],
stud[i].ave);
printf("\n");
fclose(fp); }
写入盘文件
st.dat
第 13章 文件
22:55 44
第四节 文件的定位
rewind( )函数
fseek( )函数
ftell( )函数第 13章 文件
22:55 45
rewind( )函数格式,rewind(文件指针 )
例 8,将磁盘文件” st.dat”的内容显示在屏幕上,然后将其复制到磁盘文件” st.c”中。
程序如下:
#include "stdio.h"
main( )
{FILE *fp1,*fp2;
第 13章 文件
22:55 46
if((fp1=fopen("st.dat","r"))==NULL)
{printf("Can’t open this file!\n"); exit(0);}
if((fp2=fopen("st.c","w"))==NULL)
{printf("Can’t open this file!\n"); exit(0);}
while(!feof(fp1)) putchar(fgetc(fp1));
rewind(fp1);
while(!feof(fp1)) fputc( fgetc(fp1),fp2);
fclose(fp1);fclose(fp2);
}
返回文件头内容显示复制文件第 13章 文件
22:55 47
fseek( )函数
fseek(文件指针,位移量,起始点 )
起始点 宏名 代替数字文件开始 SEEK_SET 0
文件的当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
第 13章 文件
22:55 48
文件中有一个位置指针,指向当前的读 /
写位置。如图所示:
位移量
00011100 11000011 10111101 00111011
EOF
文件开始 文件尾位置指针第 13章 文件
22:55 49
例 9,将数据文件,st.dat”中第 5个学生的数据读入内存并显示 。 程序如下:
#include "stdio.h"
struct student
{char name[9];
int score[3];
float ave;
}stud;
第 13章 文件
22:55 50
main( )
{FILE *fp;int no=5;
if((fp=fopen("st.dat","rb"))==NULL)
{printf("Can’t open this file!\n");exit(0);}
fseek(fp,(no-1)*sizeof(struct student),0);
fscanf(fp,"%s%d%d%d%f",stud.name,
&stud.score[0],&stud.score[1],
&stud.score[2],&stud.ave);
printf("%s %d %d %d %5.1f",stud.name,
stud.score[0],stud.score[1],
stud.score[2],stud[i].ave);
fclose(fp);}
第 13章 文件
22:55 51
ftell( )函数
ftell(文件指针 )
例如,long int i;
i=ftell(fp);
if(i==-1L)printf(“error!\n”);
函数调用出错判断第 13章 文件
22:55 55
第七节 文件输入输出小结
常见的错误,
用文件打开 /关闭函数时与使用方式不匹配 。
混淆文件指针与位置指针的概念 。
不能使文件正确定位,造成读 /写文件错误 。
忘记关闭文件,造成文件数据丢失 。
第 13章 文件
22:55 56
分类 函数名 功能打开文件 fopen( ) 打开文件关闭文件 fclose( ) 关闭文件文件定位 rewind( ) 文件位置指针置于文件开头
fseek( ) 改变文件位置指针文件的读写 fgetc() getc()从指定文件输入一个字符
fputc() putc()向指定文件输出一个字符
fgets() 从指定文件输入一个字符串
fputs() 向指定文件输出一个字符串
常用的缓冲文件系统函数第 13章 文件
22:55 57
分类 函数名 功能文件的读写 getw( ) 从指定文件输入一个字 (整型 )
putw( ) 向指定文件输出一个字 (整型 )
fread( ) 从指定文件输入一个数据块
fwrite( ) 向指定文件输出一个数据块
fscanf() 按指定格式从指定文件输入数据
fprintf() 按指定格式向指定文件输出数据文件的状态 ferror( ) 测试文件操作是否出错
clearerr( ) 清除文件的出错标志
常用的缓冲文件系统函数
22:55 1
第十三章 文件主讲 福州大学数学与计算机学院 韩晓芸
E-mail,hxy@fjtv.net
第 13章 文件
22:55 2
第一节 文件概述
第二节 文件的使用
第三节 文件的读写
第四节 文件的定位
第五节 文件出错检测
第六节 操作系统级的文件
第七节 文件输入输出小结第 13章 文件
22:55 3
第一节 文件概述
文件概念
数据文件存放形式
缓冲文件系统与非缓冲文件系统第 13章 文件
22:55 4
数据文件文件,是指存储在外部介质上以一定名字命名的数据集合。 包含程序文件和数据文件 。
数据文件,用来存储程序运行需要输入的数据、运算的中间结果和最终结果。
按名存取:
第 13章 文件
22:55 5
数据文件存放形式
ASCII文件,它的 每个字节存放一个 ASCII代码,代表一个字符。
二进制文件,把内存中的数据 按照其在内存中的存储形式原样 输出到磁盘上存放。
ASCII码(文本文件)、二进制文件第 13章 文件
22:55 6
00110000 00111001
二进制文件
00110001 00110010 00110011 00110100 00110101
ASCII码文件例如:一个十进制数 12345
00110000 00111001
内存第 13章 文件
22:55 7
缓冲文件系统缓冲文件系统,系统自动地在内存区为每个正在使用的文件开辟一个缓冲区,从内存向磁盘输出数据必须先送到内存的缓冲区,装满缓冲区后才一起送到磁盘 。 反过来,从磁盘向内存读入数据,则依次从磁盘文件将一批数据读到缓冲区,充满后再从缓冲区逐个将数据送到程序数据区。
第 13章 文件
22:55 8
缓冲文件系统示意图内 存写盘读盘输出程序数据区缓冲区缓冲区磁盘输 入第 13章 文件
22:55 9
第二节 文件的使用
文件类型 FILE
文件指针 FILE *fp;
文件的打开和关闭第 13章 文件
22:55 10
文件类型在 stdio.h文件中定义 FILE:
typedef struct
{int _fd; 文件号
int _cleft; 缓冲区中剩下的字符
int _mode; 文件操作的模式
char *_nextc;下一个字符的位置
char *_buff; 文件缓冲区的位置
}FILE;
第 13章 文件
22:55 11
文件指针
FILE *fp;
fp--指向 FILE类型结构体的指针变量 。通过文件指针变量 fp可以引用 fp指向的文件。
第 13章 文件
22:55 12
文件的打开和关闭
1,文件的打开 ——fopen( )函数
FILE *fp;
fp=fopen(文件名,使用文件方式 )
例如:
fp=fopen(“file1.dat”,“r”)
打开一个文件时要向编译系统提供三个信息:
–要打开的文件名
–打开方式
–指向文件的指针第 13章 文件
22:55 13
文件使用方式 意义
r 只读,为读文件打开一个文本文件
w 只写,为写文件打开一个文本文件
a 追加,向文本文件尾部追加数据
rb 只读,为读文件打开一个二进制文件
wb 只写,为写文件打开一个二进制文件
ab 追加,向二进制文件尾部追加数据
r+ 读 / 写,为读 / 写文件打开一个文本文件
w+ 读 / 写,为读 / 写文件建立并打开一个新的文本文件
a+ 读 / 写,为读 / 写文件打开一个文本文件
rb+ 或 r+b 读 / 写,为读 / 写文件打开一个二进制文件
wb+ 或 w+b 读 / 写,为读 / 写文件建立并打开一个新的二进制文件
ab+ 或 a+b 读 / 写,为读 / 写文件打开一个二进制文件文件的使用方式第 13章 文件
22:55 14
说明:
(1) 用 r (只读 )方式打开的文件 只能用于程序从文件输入数据,不能向文件输出数据,而且要求该文件已经存在,否则函数 fopen( )将返回空指针 NULL。
(2) 用 w(只写 )方式打开的文件 只能用于向文件输出数据,不能从该文件中输入数据,如果打开时原文件不存在,则新建该文件,如果原文件已经存在,则删除原文件里的数据 。
第 13章 文件
22:55 15
说明:
(3) 用 a(追加 )方式打开的文件,表示不删除原文件里的数据,而是从文件的末尾开始添加数据,要求被打开的文件已经存在,打开后,文件的位置指针将定位在文件的尾部,如果要打开的文件不存在,则函数 fopen( )返回一个空指针 NULL。
第 13章 文件
22:55 16
(4) 用 r+,w+,a+(读 /写 )方式打开的文件,既可以从文件输入数据,也可以向文件输出数据,
其中 r+只 允许打开已存在的文本文件,用 w+方式打开,则系统新建一个文件,先向文件输出数据,然后才能从文件输入数据 。 用 a+方式 是打开已经存在的文件,并且文件的位置指针定位在文件的末尾,先准备向文件添加数据,以后也可以从文件输入数据 。
第 13章 文件
22:55 17
(5) 上述打开的文件都是针对文本文件,如果 要打开二进制文件,必须在使用方式面添上字符 b,如 rb表 示以只读方式打开一个二进制文件 。
第 13章 文件
22:55 18
(6) 调用函数 fopen( )时,可能因某种原因不能正常打开指定的文件,则函数将返回一个空指针 NULL
( NULL在,stdio.h”文件中被定义为 0) 。 我们常用以下语句来打开某个文件:
if((fp=fopen(“file”,“r”))==NULL)
{printf(“Can’t open this file! \n”);
exit(0);}
函数 exit( )的 作用是关闭所有的文件,终止正在调用的过程,用此函数应当加 stdlib.h头文件 。
第 13章 文件
22:55 19
(7) 在程序开始运行时,系统将自动打开三个标准文件,标准输入,标准输出和标准出错输出 。 通常这三个文件都和终端相联系,系统自动定义了三个文件指针 stdin,stdout和 stderr,分别指向终端输入,终端输出和标准出错输出,一般从终端输入即从键盘输入,向终端输出即向显示器输出 。 标准出错输出也是向显示器输出 。
第 13章 文件
22:55 20
程序运行时系统自动打开标准文件:
标准输入标准输出标准出错输出系统自动定义文件指针:
stdin
stdout
stderr
第 13章 文件
22:55 21
2.文件的关闭 —fclose( )函数
fclose(文件指针 )
例如,fclose(fp);
返回值为 0--顺利执行关闭操作返回值非 0--执行关闭操作有错第 13章 文件
22:55 22
第三节 文件的读写
读写一个字符的函数
— fgetc( )和 fputc( )
读写数据块的函数
— fread( )和 fwrite( )
格式化读写函数
— fscanf( )和 fprintf( )
其它读写函数第 13章 文件
22:55 23
读写一个字符的函数
— fgetc( )和 fputc( )
1,fgetc( )函数说明形式,int fgetc(FILE *fp);
功能,从 fp所指向的文件读入一个字符,函数的返回值就是它读入的字符,读入时如果遇到结束符,则函数返回 文件结束标记 EOF
( stdio.h中定义的符号常量,值为 -1)。
第 13章 文件
22:55 24
读写一个字符的函数
— fgetc( )和 fputc( )
例如,想从磁盘 文本文件 顺序读入字符并输出到屏幕上,可以,ch=fgetc(fp);
while(ch!=EOF)
{putchar(ch); ch=fgetc(fp);}
feof(fp)函数 --判断文件是否结束。
例如,想从磁盘 二进制文件 顺序读入数据,可以:
while(!feof(fp))
{c=fgetc(fp);,..}
第 13章 文件
22:55 25
2,fputc( )函数说明语句,int fputc(char ch,FILE *fp);
功能,把一个字符 ch写到 fp所指向的 磁盘文件上。输出成功返回值就是输出的字符,如果失败,则返回 EOF。
读写一个字符的函数
— fgetc( )和 fputc( )
第 13章 文件
22:55 26
例 1,读入 file1.dat文本文件 中的字符,然后依次输出到显示器 。
main( )
{char c; FILE *fp;
if(( fp=fopen("file1.dat","r"))==NULL)
{printf("Can’t open this file! \n"); exit(0);}
while((c=fgetc(fp))!=EOF)
printf("%c",c);}
文件尾第 13章 文件
22:55 27
例 2,读入 file2.dat二进制文件 中的数据,然后依次输出 到显示器。
main( )
{ char c; FILE *fp;
if ((fp=fopen(“file2.dat”,“rb”))==NULL)
{printf(“Can’t open this file! \n”);
exit(0); }
while(!feof(fp))
{c=fgetc(fp); printf(“%c”,c); }}
文件尾第 13章 文件
22:55 28
例 3,将键盘上输入的字符串写入到文本文件
file3.dat中。
main( )
{char ch[80];int i=0; FILE *fp;
if((fp=fopen("file3.dat","w"))==NULL)
{printf("Can’t open this file!\n");
exit(0);}
scanf("%s",ch);
while(ch[i]!=’\0’)
{fputc(ch[i],fp);i++;}
}
abcdefgh
键盘输入第 13章 文件
22:55 29
例 4,将一个磁盘文件中的信息复制到另一个磁盘文件中 。
#include "stdio.h"
main( )
{FILE *in,*out;
char ch,infile[15],outfile[15];
printf("请输入读入信息的文件名,\n");
scanf("%s",infile);
printf("请输入输出信息的文件名,\n");
scanf("%s",outfile );
第 13章 文件
22:55 30
if((in=fopen(infile," r"))==NULL)
{printf("Can’t open infile\n"); exit(0);}
if((out=fopen(outfile,"w"))==NULL)
{printf("Can’t open outfile\n");exit(0);}
while(!feof(in))
{ch=fgetc(in);fputc(ch,out);}
fclose(in);fclose(out);}
infile 内存单元 outfile
r w
第 13章 文件
22:55 31
程序运行情况:
请输入读入信息的文件名,file.dat
请输入输出信息的文件名,copyfile.dat
c:\>type file.dat
basic,fortran and c
computer
c:>type copyfile.dat
basic,fortran and c
computer
验证第 13章 文件
22:55 32
读写数据块的函数
—— fread( )和 fwrite( )
1.fread( )函数
int fread(char *buffer,
int size,int count,FILE *fp)
2.fwrite( )函数
int fwrite(char *buffer,
int size,int count,FILE *fp)
第 13章 文件
22:55 33
buffer,存放读 /写数据的起始地址。
size,读 /写字节数。
count,读 /写 size字节的数据项。
fp,文件型指针。
函数调用成功:返回 count的值。
当以 二进制形式 打开文件时,函数可以读写任何类型的信息。
说明:
第 13章 文件
22:55 34
例 5,从键盘输入 10个学生的学号、姓名、年龄和地址的有关数据,然后把它们存储到磁盘文件 stu.dat。程序如下:
#include "stdio.h"
#define SIZE 10
struct student
{long num;char name[10];int age;
char addr[40];}stud[SIZE];
第 13章 文件
22:55 35
main( )
{int i;
for(i=0;i<SIZE;i++)
scanf("%ld%s%d%s",
&stud[i].num,
stud[i].name,
&stud[i].age,
stud[i].addr );
save( );}
1001 张 梨 17 301室
1002 李建平 18 302室
1003 唐琴利 19 107室
1004 林 茹 20 504室
1005 汪奇才 16 101室
1006 樊 洋 18 102室
1007 吴 语 19 303室
1008 冯 挺 20 103室
1009 李 萱 17 102室
1010 蔡 虹 18 104室输入,
第 13章 文件
22:55 36
stu.dat
1001 张梨 17 301室
void save( )
{FILE *fp;int i;
if((fp=fopen("stu.dat","wb"))==NULL)
{printf("Can’t open this file!\n");
exit(0);}
for(i=0;i<SIZE;i++)
if(fwrite(&stud[i],sizeof(struct student),
1,fp)!=1)
printf("File write error!\n");
fclose(fp);}
第 13章 文件
22:55 37
格式化读写函数
— fscanf( )和 fprintf( )
1,fscanf( ) 函数
fscanf(文件指针,格式字符串,输入地址表列 )
例,fscanf(fp,“%d,%f”,&i,&f);
2,fprintf( ) 函数
fprintf(文件指针,格式字符串,输出表列 )
例,fprintf(fp,“%3d,%6.1f”,i,f);
第 13章 文件
22:55 38
例 6,从键盘输入 10个学生的姓名和三门课程的成绩,并计算出每个人的平均成绩,然后将所有数据存放到文本文件 st.dat中 。 程序如下:
#include "stdio.h"
#define NO 10
struct student
{char name[9];
int score[3];
float ave;}stud[NO];
第 13章 文件
22:55 39
main( )
{int i,j,sum; FILE *fp;
if((fp=fopen("st.dat","wb"))==NULL)
{printf("Can’t open thisfile!\n");
exit(0); }
for(i=0;i<NO;i++)
{scanf("%s",stud[i].name);
sum=0;
for(j=0;j<3;j++)
{scanf("%d",&stud[i].score[j]);
sum+=stud[i].score[j];}
stud[i].ave=sum/3.0;}
第 13章 文件
22:55 40
for(i=0;i<NO;i++)
fprintf(fp,"%s %d %d %d%5.1f",
stud[i].name,stud[i].score[0],
stud[i].score[1],stud[i].score[2],
stud[i].ave);
printf("\n");
fclose(fp); }
写入盘文件
st.dat
第 13章 文件
22:55 44
第四节 文件的定位
rewind( )函数
fseek( )函数
ftell( )函数第 13章 文件
22:55 45
rewind( )函数格式,rewind(文件指针 )
例 8,将磁盘文件” st.dat”的内容显示在屏幕上,然后将其复制到磁盘文件” st.c”中。
程序如下:
#include "stdio.h"
main( )
{FILE *fp1,*fp2;
第 13章 文件
22:55 46
if((fp1=fopen("st.dat","r"))==NULL)
{printf("Can’t open this file!\n"); exit(0);}
if((fp2=fopen("st.c","w"))==NULL)
{printf("Can’t open this file!\n"); exit(0);}
while(!feof(fp1)) putchar(fgetc(fp1));
rewind(fp1);
while(!feof(fp1)) fputc( fgetc(fp1),fp2);
fclose(fp1);fclose(fp2);
}
返回文件头内容显示复制文件第 13章 文件
22:55 47
fseek( )函数
fseek(文件指针,位移量,起始点 )
起始点 宏名 代替数字文件开始 SEEK_SET 0
文件的当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
第 13章 文件
22:55 48
文件中有一个位置指针,指向当前的读 /
写位置。如图所示:
位移量
00011100 11000011 10111101 00111011
EOF
文件开始 文件尾位置指针第 13章 文件
22:55 49
例 9,将数据文件,st.dat”中第 5个学生的数据读入内存并显示 。 程序如下:
#include "stdio.h"
struct student
{char name[9];
int score[3];
float ave;
}stud;
第 13章 文件
22:55 50
main( )
{FILE *fp;int no=5;
if((fp=fopen("st.dat","rb"))==NULL)
{printf("Can’t open this file!\n");exit(0);}
fseek(fp,(no-1)*sizeof(struct student),0);
fscanf(fp,"%s%d%d%d%f",stud.name,
&stud.score[0],&stud.score[1],
&stud.score[2],&stud.ave);
printf("%s %d %d %d %5.1f",stud.name,
stud.score[0],stud.score[1],
stud.score[2],stud[i].ave);
fclose(fp);}
第 13章 文件
22:55 51
ftell( )函数
ftell(文件指针 )
例如,long int i;
i=ftell(fp);
if(i==-1L)printf(“error!\n”);
函数调用出错判断第 13章 文件
22:55 55
第七节 文件输入输出小结
常见的错误,
用文件打开 /关闭函数时与使用方式不匹配 。
混淆文件指针与位置指针的概念 。
不能使文件正确定位,造成读 /写文件错误 。
忘记关闭文件,造成文件数据丢失 。
第 13章 文件
22:55 56
分类 函数名 功能打开文件 fopen( ) 打开文件关闭文件 fclose( ) 关闭文件文件定位 rewind( ) 文件位置指针置于文件开头
fseek( ) 改变文件位置指针文件的读写 fgetc() getc()从指定文件输入一个字符
fputc() putc()向指定文件输出一个字符
fgets() 从指定文件输入一个字符串
fputs() 向指定文件输出一个字符串
常用的缓冲文件系统函数第 13章 文件
22:55 57
分类 函数名 功能文件的读写 getw( ) 从指定文件输入一个字 (整型 )
putw( ) 向指定文件输出一个字 (整型 )
fread( ) 从指定文件输入一个数据块
fwrite( ) 向指定文件输出一个数据块
fscanf() 按指定格式从指定文件输入数据
fprintf() 按指定格式向指定文件输出数据文件的状态 ferror( ) 测试文件操作是否出错
clearerr( ) 清除文件的出错标志
常用的缓冲文件系统函数