C语言第十章 文件(18)

更新时间:2023-08-11 05:44:01 阅读量: 人文社科 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

§10.1 C文件概述

第十章 文件

文件:存储在外部介质上数据的集合,是操作系统 数据管理的单位使用数据文件的目的 文件分类

1、数据文件的改动不引起程序的改动——程序与数据分离 按文件的逻辑结构: 2、不同程序可以访问同一数据文件中的数据——数据共享 3、能长期保存程序运行的中间数据或结果数据 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成

按存储介质: 普通文件:存储介质文件(磁盘、磁带等) 设备文件:非存储介质(键盘、显示器、打印机等)

按数据的组织形式: 文本文件: ASCII文件,每个字节存放一个字符的ASCII码 二进制文件:数据按其在内存中的存储形式原样存放

文本文件特点: 存储量大、速度慢、便于对字符操作如 int型数10000

ASCII形式0011000100110000001100000011000000110000

0010011100010000 0010011100010000

内存存储形式二进制形式

二进制文件特点: 存储量小、速度快、便于存放中间结果

文件处理方法 缓冲文件系统:高级文件系统,系统自动为正在使用 的文件开辟内存缓冲区 非缓冲文件系统:低级文件系统,由用户在程序中为 每个文件设定缓冲区程序 输入文件缓冲区 缓冲文件系统: 非缓冲文件系统: 指令区 程序数据区 用户数据区 a 磁盘文件 磁盘

输出文件缓冲区 缓冲区

§10.2 文件类型指针 文件结构体FILE 缓冲文件系统为每个正使用的文件在内存开辟文件信 息区 文件信息用系统定义的名为FILE的结构体描述 FILE定义在stdio.h中typedef struct { int _fd; int _cleft; int _mode; char *_next; char *_buff; }FILE; //文件号 //缓冲区中剩下的字符数 //文件操作方式 //文件当前读写位置 //文件缓冲区位置

文件类型指针 指针变量说明: FILE *fp; 用法: 文件打开时,系统自动建立文件结构体,并把指向它的指针 返回来,程序通过这个指针获得文件信息,访问文件 文件关闭后,它的文件结构体被释放 文件名 C程序 文件使用 方式 文件类型指针 操作系统

磁盘

§10.3 文件的打开与关闭含义 文件使用方式 C文件操作用库函数实现,包含在stdio.h 例 文件打开与测试 “r/rb” (只读) FILE *fp; 为输入打开一个文本/二进制文件 文件使用方式:打开文件-->文件读/写-->关闭文件 “w/wb” (只写) fp=fopen(“aa.c”,“w”); 为输出打开或建立一个文本/二进制文件 系统自动打开和关闭三个标准文件:

打开文件fopen

char *filename=“c:\\fengyi\\bkc\\test.dat” 标准输出------显示器 stdout exit(0); fp= fopen (“c:\\fengyi\\bkc\\test.dat”,”r”); “w+/wb+” (读

写) fopen(filename,”r”); 为读/写建立一个文本/二进制文件 fp= 标准出错输出-----显示器 stderr } “a+/ab+” (读写) 为读/写打开或建立一个文本/二进制文件 使用文件方式 函数原型: FILE *fopen(char *name,char *mode)

“a/ab” (追加) if(fp==NULL) 向文本/二进制文件尾追加数据 标准输入------键盘 例 FILE printf(“File open stdin *fp; error!\n”); 例 FILE “r+/rb+” (读写){ *fp; 为读/写打开一个文本/二进制文件

功能:按指定方式打开文件 要打开的文件名 返值:正常打开,为指向文件结构体的指针;打 开失败,为NULL

文件关闭fclose 作用:使文件指针变量与文件 脱钩 ,释放文件结构 体和文件指针 函数原型:int fclose(FILE *fp) 功能:关闭fp指向的文件 返值:正常关闭为0;出错时,非0 文件打开时返回的文件类型指针缓冲文件系统:

不关闭文件可能会丢失数据磁盘文件

输入文件缓冲区 程序数据区 a

输出文件缓冲区

fclose

§10.4 文件的读写 字符I/O:fputc与fgetc fputc 函数原型:int

fputc(int c, FILE *fp)

fgetc

功能:把一字节代码c写入fp指向的文件中 返值:正常,返回c;出错,为EOF 函数原型:int

fgetc(FILE *fp)

功能:从fp指向的文件中读取一字节代码 返值:正常,返回读到的代码值;读到文件尾或出错,为EOF

#define #define #define #define

文件I/O与终端I/O putc(ch,fp) fputc(ch,fp) getc(fp) fgetc(fp) putchar( c ) fputc(c,stdout) getchar( ) fgetc(stdin)

#include <stdio.h> #include <stdio.h> main() main() FILE *in, {{ FILE *fp; *out; 判断二进制文件是否结束 char ch,infile[10],outfile[10]; char ch,*filename=“out.txt”; #include <stdio.h> while(!feof(fp)) scanf("%s",infile); if((fp=fopen(filename,"w"))==NULL) main() {printf("cannot open c=fgetc(fp); {scanf("%s",outfile); file\n"); { FILE *fp; if ((in =…….. fopen(infile, "r"))== NULL) exit(0); 例 读文本文件内容, char ch,*filename=“out.txt”; } { printf("Cannot open infile.\n"); } if((fp=fopen(filename,”r"))==NULL) 并显示 exit(0); printf("Please inputopen file\n"); { printf("cannot string:"); } ch=getchar(); 例 文件拷贝 exit(0); feof if ((out = fopen(outfile, "w"))== NULL) while(ch!='#') } { printf("Cannot 函数原型: int feof(FILE *fp) open outfile.\n"); { while((ch=fgetc(fp))!=EOF) fputc(ch,fp); exit(0); 功能:判断文件是否结束 putchar(ch); } ch=getchar(); 返值:文件结束,返回真(非0);文件未结束,返回0 fclose(fp); 判断文本文件是否结束 while (!feof(in)) }} fputc(fgetc(in), out); fclose(fp); } fclose(in); fclose(out); } 例 从键盘输入字符,逐个 存到磁盘文件中,直到 输入‘#“为止

数据块I/O:fread与fwrite 函数原型: size_t fread(void *buffer,size_t size, size_t count,FILE *fp) size_t fwrite(void *b

uffer,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个学生数据,把他们转存到磁盘文件中去void save() void display() #include <stdio.h> { {FILE *fp; FILE *fp; #define SIZE 2 int i; i; int struct student_type if((fp=fopen("d:\\fengyi\\exe\\stu_dat","wb"))==NULL) if((fp=fopen("d:\\fengyi\\exe\\stu_dat","rb"))==NULL) { char name[10]; { { printf("cannot open file\n"); printf("cannot open file\n"); int num; return; return; int age; }} char addr[15]; for(i=0;i<SIZE;i++) for(i=0;i<SIZE;i++) }stud[SIZE]; if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1) { fread(&stud[i],sizeof(struct student_type),1,fp); main() printf("file write error\n"); printf("%-10s %4d %4d %-15s\n",stud[i].name, { fclose(fp); stud[i].num,stud[i].age,stud[i].addr); int i; } for(i=0;i<SIZE;i++) } fclose(fp); scanf("%s%d%d%s",stud[i].name,&stud[i].num, } &stud[i].age,stud[i].addr); save(); display(); }

格式化I/O:fprintf与fscanf#include <stdio.h> 函数原型: main() int fprintf(FILE *fp,const char *format[,argument,…]) { char *fp,const char *format[,address,…]) int fscanf(FILE s[80],c[80]; int a,b; 功能:按格式对文件进行I/O操作 FILE *fp; 返值:成功,返回I/O的个数;出错或文件尾,返回EOF if((fp=fopen("test","w"))==NULL) { puts("can't open file"); exit() ; } 例 fprintf(fp,“%d,%6.2f”,i,t); //将i和t按%d,%6.2f格式输出到fp文件 fscanf(stdin,"%s%d",s,&a);/*read from keaboard*/ fscanf(fp,“%d,%f”,&i,&t); //若文件中有3,4.5 ,则将3送入i, 4.5送入t 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); }

字符串I/O: fgets与fputs #include<stdio.h> 函数原型: char *fgets(char *s,int n,FILE *fp) main() { FILE *fp; int fputs(char *s,FILE *fp)char string[81]; 功能:从fp指向的文件读/写一个字符串 if((fp=fopen("file.txt","w"))==NULL) 返值: fputs把s指向的字符串写入fp指向的文件 { printf("cann't open file");exit(0); fgets从fp所指文件读n-1个字符送入s指向的内存区, } fgets正常时返回读取字符串的首地址;出

错或文件尾,返回 并在最后加一个‘\0’while(strlen(gets(string))>0) NULL { fputs(string,fp); (若读入n-1个字符前遇换行符或文件尾(EOF)即结束) fputs正常时返回写入的最后一个字符;出错为EOF 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); }

§10.5 文件的定位 几个概念 文件位置指针-----指向当前读写位置的指针 读写方式 #include <stdio.h> 顺序读写:位置指针按字节位置顺序移动,叫~ main() 随机读写:位置指针按需要移动到任意位置,叫~ { FILE *fp1,*fp2; rewind函数 fp1=fopen("d:\\fengyi\\bkc\\ch12_4.c","r"); fp2=fopen("d:\\fengyi\\bkc\\ch12_41.c","w"); 函数原型: void rewind(FILE *fp) while(!feof(fp1)) putchar(getc(fp1)); 功能:重置文件位置指针到文件开头 rewind(fp1); 返值:无 while(!feof(fp1)) putc(getc(fp1),fp2); fclose(fp1); 例 对一个磁盘文件进行显示和复制两次操作 fclose(fp2); }

main() #include"stdio.h" fseek函数 int i; { FILEmain() *fp; 函数原型: int fseek(FILE *fp,long offset,int whence) { FILE *fp; if((fp=fopen("studat","rb"))==NULL) 功能:改变文件位置指针的位置 char filename[80]; { printf("can't open file\n");exit(0); } 返值:成功,返回0;失败,返回非0值 long length; for(i=0;i<3;i+=2) gets(filename); 文件指针起始点 { fseek(fp,i*sizeof(struct student_type),0); 位移量(以起始点为基点,移动的字节数) ftell函数 例 fseek(fp,100L,0); fp=fopen(filename,"rb"); SEEK_SET 0 文件开始 fread(&stud[i],sizeof(struct student_type),1,fp); >0 向后移动ftell(FILE *fp) fseek(fp,50L,1); 函数原型:printf("%s %d %d %s\n", long if(fp==NULL) 文件当前位置 <0 向前移动 fseek(fp,-10L,2); found!\n"); SEEK_CUR 1 printf("file not 功能:返回位置指针当前位置(用相对文件开头的位移 2 文件末尾 SEEK_END stud[i].name,stud[i].num,stud[i].age,stud[i].addr); else 量表示) } { fseek(fp,0L,SEEK_END); #include <stdio.h> 返值:成功,返回当前位置指针位置;失败,返回-1L, fclose(fp); struct student_type length=ftell(fp); } { int num; 例 磁盘文件上有3个学生数据,要求读入第1,3学生数据并显示 printf("Length of File is %1d bytes\n",length); char name[10]; fclose(fp); int age; } 例 求文件长度(ch12_101.c) char addr[15]; } }stud[3];

§10.6 出错的检测 ferror函数 函数原型: int ferror(FILE *fp) 功能:测试文件是否出现错误 返值:未出错,0;出错,非0 说明 每次调用文件输入输出函数,均产生一个新的ferror函数值, 所以应及时测试 fopen打开文件时,ferror函数初值自动置为0

clearerr函数#include clearerr(FILE *fp) 函数原型

: void <stdio.h> int main(void) 功能:使文件错误标志置为0 { FILE *stream; 返值:无 stream = fopen("DUMMY.FIL", "w"); 说明:出错后,错误标志一直保留,直到对同一 getc(stream); 文件调clearerr(fp)或rewind或任何其它一个输入 if (ferror(stream)) 输出函数 { printf("Error reading from DUMMY.FIL\n"); clearerr(stream); 例 ferror()与clearerr()举例 } if(!ferror(stream)) printf("Error indicator cleared!"); fclose(stream); return 0; }

本文来源:https://www.bwwdw.com/article/a7ej.html

Top