null第十三章 文件第十三章 文件13.1 C语言文件的概念
1. 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位使用数据文件的目的
1、数据文件的改动不引起程序的改动——程序与数据分离
2、不同程序可以访问同一数据文件中的数据——数据共享
3、能长期保存程序运行的中间数据或结果数据2. 文件分类2. 文件分类按文件的逻辑结构:
记录文件:由具有一定结构的记录组成(定长和不定长)
流式文件:由一个个字符(字节)数据顺序组成
按存储介质:
普通文件:存储介质文件(磁盘、磁带等)
设备文件:非存储介质(键盘、显示器、打印机等)
按数据的组织形式:
文本文件: ASCII文件,每个字节存放一个字符的ASCII码
二进制文件:数据按其在内存中的存储形式原样存放3.文本文件与二进制文件的特点3.文本文件与二进制文件的特点文本文件特点:
存储量大、速度慢、便于对字符操作二进制文件特点:
存储量小、速度快、便于存放中间结果4. 文件处理方法4. 文件处理方法缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区
非缓冲文件系统:低级文件系统,由用户在程序中为每个文件设定缓冲区13.2 文件类型指针13.2 文件类型指针typedef struct
{ int _fd; //文件号
int _cleft; //缓冲区中剩下的字符数
int _mode; //文件操作方式
char *_next; //文件当前读写位置
char *_buff; //文件缓冲区位置
}FILE;1. 文件结构体类型 FILE
缓冲文件系统为每个正使用的文件在内存开辟文件信息区
文件信息用系统定义的名为FILE的结构体描述
FILE定义在stdio.h中 不同的C语言编译器,对于文件结构体的定义有所不同,但是C
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
每个C编译器都应该提供一套读写文件数据的函数。而本章的主要目的也就是要学会使用这些函数。 2. 文件类型指针(重点掌握)2. 文件类型指针(重点掌握)指针变量说明: FILE *fp;
用法:
文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件
文件关闭后,它的文件结构体被释放13.3 文件的打开与关闭13.3 文件的打开与关闭功能:按指定方式打开文件
返值:正常打开,为指向文件结构体的指针;打开失败,为NULL要打开的文件名C文件操作用库函数实现,需使用#include
文件使用方式:打开文件-->文件读/写-->关闭文件
系统自动打开和关闭三个标准文件:
标准输入------键盘 stdin
标准输出------显示器 stdout
标准出错输出-----显示器 stderr
1. 打开文件函数:fopen( ) (重点掌握)
函数原型: FILE *fopen(char *name,char *mode)使用文件方式文件使用方式文件使用方式FILE *fopen(char *name,char *mode)例 文件打开与测试例 文件打开与测试例 文件打开与测试
FILE *fp;
fp=fopen("aa.txt", "w");
if(fp==NULL)
{ printf("File open error!\n");
exit(0);
}例 FILE *fp;
fp= fopen ("c:\\fengyi\\bkc\\test.dat", "r"); 例 FILE *fp;
char *filename= "c:\\fengyi\\bkc\\test.dat"
fp= fopen(filename, "r"); 2. 文件关闭函数: fclose( ) (重点掌握)2. 文件关闭函数: fclose( ) (重点掌握)功能:关闭fp指向的文件
返值:正常关闭为0;出错时,非0不关闭文件可能会丢失数据作用:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针
函数原型:int fclose(FILE *fp)fp:文件打开时返回的文件类型指针13.4 文件的读写13.4 文件的读写fgetc
函数原型:int fgetc(FILE *fp)
功能:从fp指向的文件中读取一字节代码
返回值:正常,返回读到的代码值;
读到文件尾或出错,为EOF1. 字符I/O:fputc与fgetc (自学)
fputc
函数原型:int fputc(int c, FILE *fp)
功能:把一字节代码c写入fp指向的文件中
返回值:正常,返回: c
出错,返回值为:EOF例1 从键盘输入字符,逐个存到磁盘文件中,直到输入‘#’为止。#include
main()
{ FILE *fp;
char ch,*filename=“out.txt”;
if((fp=fopen(filename,"w"))==NULL)
{ printf("cannot open file\n");
exit(0);
}
printf("Please input string:");
ch=getchar();
while(ch!='#')
{ fputc(ch,fp);
putchar(ch);
ch=getchar();
}
fclose(fp);
}例1 从键盘输入字符,逐个存到磁盘文件中,直到输入‘#’为止。例2 读文本文件内容,并显示#include
main()
{ FILE *fp;
char ch,*filename= "out.txt";
if((fp=fopen(filename,”r”))==NULL)
{ printf("cannot open file\n");
exit(0);
}
while((ch=fgetc(fp))!=EOF)
putchar(ch);
fclose(fp);
}判断文本文件是否结束例2 读文本文件内容,并显示2. feof( )函数 特别是判断二进制文件是否结束时,一定要用feof( )函数
while(!feof(fp))
{ c=fgetc(fp);
……..
}函数原型: int feof(FILE *fp)
功能:判断文件是否结束
返值:文件结束,返回真(非0);文件未结束,返回02. feof( )函数例3 文件拷贝#include
main()
{ FILE *in, *out;
char ch,infile[10],outfile[10];
scanf("%s",infile);
scanf("%s",outfile);
if ((in = fopen(infile, "r"))== NULL)
{ 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);
}例3 文件拷贝3. 数据块I/O:fread与fwrite (自学)3. 数据块I/O:fread与fwrite (自学)size_t fread(void *buffer,size_t size, size_t count,FILE *fp)
size_t fwrite(void *buffer,size_t size, size_t count,FILE *fp)功能:读/写数据块
返值:成功,返回读/写的块数;出错或文件尾,返回0
说明:
typedef unsigned size_t;
buffer: 指向要输入/输出数据块的首地址的指针
size: 每个要读/写的数据块的大小(字节数)
count: 要读/写的数据块的个数
fp: 要读/写的文件指针
fread与fwrite 一般用于二进制文件的输入/输出函数原型:例例 float f[2];
FILE *fp;
fp=fopen("aa.dat", "rb");
fread(f,4,2,fp);for(i=0;i<2;i++)
fread(&f[i],4,1,fp);例 struct student
{ int num;
char name[20];
char sex;
int age;
float score[3];
}stud[10];
for(i=0;i<10;i++)
fread(&stud[i],sizeof(struct student),1,fp);例4. 格式化I/O:fprintf()与fscanf() (重点掌握)4. 格式化I/O:fprintf()与fscanf() (重点掌握)int fprintf(FILE *fp,const char *format[,argument,…])
int fscanf(FILE *fp,const char *format[,address,…])功能:按格式对文件进行I/O操作
返值:成功,返回I/O的个数;出错或文件尾,返回EOF例 fprintf(fp, "%d,%6.2f ",i,t); //将i和t按%d,%6.2f格式输出到fp文件
fscanf(fp, "%d,%f ",&i,&t); //若文件中有3,4.5 ,则将3送入i, 4.5送入t函数原型:例 从键盘按格式输入数据存到磁盘文件中去例 从键盘按格式输入数据存到磁盘文件中去#include
main()
{ char s[80],c[80];
int a,b;
FILE *fp;
if((fp=fopen("test","w"))==NULL)
{ puts("can't open file"); exit() ; }
fscanf(stdin,"%s%d",s,&a);/*read from keaboard*/
fprintf(fp,"%s %d",s,a);/*write to file*/
fclose(fp);
if((fp=fopen("test","r"))==NULL)
{ puts("can't open file"); exit(); }
fscanf(fp,"%s%d",c,&b);/*read from file*/
fprintf(stdout,"%s %d",c,b);/*print to screen*/
fclose(fp);
}5. 字符串I/O: fgets()与fputs() (自学)函数原型:char *fgets(char *s, int n, FILE *fp)
int fputs(char *s, FILE *fp)功能:从fp指向的文件读/写一个字符串
返回值:
fgets正常时返回读取字符串的首地址;出错或文件尾,返回NULL
fputs正常时返回写入的最后一个字符;出错为EOFfgets从fp所指文件读入最大长度为n-1个字符的字符串,送入s指向的内存区。(在读入过程中,若遇换行符或文件尾(EOF)即结束)。fputs把s指向的字符串写入fp指向的文件。5. 字符串I/O: fgets()与fputs() (自学)例 从键盘读入字符串存入文件,再从文件读回显示#include
main()
{ FILE *fp;
char string[81];
if((fp=fopen("file.txt","w"))==NULL)
{ printf("cann't open file");exit(0); }
while(strlen(gets(string))>0)
{ fputs(string,fp);
fputs("\n",fp);
}
fclose(fp);
if((fp=fopen("file.txt","r"))==NULL)
{ printf("cann't open file");exit(0); }
while(fgets(string,81,fp)!=NULL)
fputs(string,stdout);
fclose(fp);
}例 从键盘读入字符串存入文件,再从文件读回显示13.5 文件的定位(自学)13.5 文件的定位(自学)例 对一个磁盘文件进行显示和复制两次操作1. 几个概念
文件位置指针-----指向当前读写位置的指针
读写方式
顺序读写:位置指针按字节位置顺序移动
随机读写:位置指针按需要移动到任意位置
2. rewind函数
函数原型: void rewind(FILE *fp)
功能:重置文件位置指针到文件开头
返值:无#include
main()
{ FILE *fp1,*fp2;
fp1=fopen("d:\\fengyi\\bkc\\ch12_4.c","r");
fp2=fopen("d:\\fengyi\\bkc\\ch12_41.c","w");
while(!feof(fp1)) putchar(getc(fp1));
rewind(fp1);
while(!feof(fp1)) putc(getc(fp1),fp2);
fclose(fp1);
fclose(fp2);
}3. fseek函数3. fseek函数文件指针例 fseek(fp,100L,0);
fseek(fp,50L,1);
fseek(fp,-10L,2); 函数原型: int fseek(FILE *fp,long offset,int whence)
功能:改变文件位置指针的位置
返值:成功,返回0;失败,返回非0值位移量(以起始点为基点,移动的字节数)
>0 向后移动
<0 向前移动起始点
文件开始 SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2例 磁盘文件上有3个学生数据,要求读入第1,3学生数据并显示例 磁盘文件上有3个学生数据,要求读入第1,3学生数据并显示#include
struct student_type
{ int num; char name[10];
int age; char addr[15];
}stud[3];
main()
{int i; FILE *fp;
if((fp=fopen("studat","rb"))==NULL)
{printf("can't open file\n");exit(0); }
for(i=0;i<3;i+=2)
{fseek(fp,i*sizeof(struct student_type),0);
fread(&stud[i],sizeof(struct student_type),1,fp);
printf("%s %d %d %s\n",
stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
}
fclose(fp);
}4. ftell函数4. ftell函数函数原型: long ftell(FILE *fp)
功能:返回位置指针当前位置(用相对文件开头的位移量
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示)
返值:成功,返回当前位置指针位置;失败,返回-1L,#include"stdio.h"
main()
{ FILE *fp; char filename[80];
long length; gets(filename);
fp=fopen(filename,"rb");
if(fp==NULL) printf("file not found!\n");
else { fseek(fp,0L,SEEK_END);
length=ftell(fp);
printf("Length of File is %1d bytes\n",length);
fclose(fp);
}
}例 求文件长度(ch12_101.c)13.6 出错的检测(自学)13.6 出错的检测(自学)1. ferror函数
函数原型: int ferror(FILE *fp)
功能:测试文件是否出现错误
返值:未出错,0;出错,非0
说明
每次调用文件输入输出函数,均产生一个新的ferror函数值,所以应及时测试
fopen打开文件时,ferror函数初值自动置为02. clearerr函数2. clearerr函数函数原型: void clearerr(FILE *fp)
功能:使文件错误标志置为0
返回值:无
说明:出错后,错误标志一直保留,直到对同一文件调clearerr(fp)或rewind或任何其它一个输入输出函数例 ferror()与clearerr()举例例 ferror()与clearerr()举例#include
int main(void)
{ FILE *stream;
stream = fopen("DUMMY.FIL", "w");
getc(stream);
if (ferror(stream))
{ printf("Error reading from DUMMY.FIL\n");
clearerr(stream);
}
if(!ferror(stream))
printf("Error indicator cleared!");
fclose(stream);
return 0;
}