文件
9 文件
文件系统 缓冲型文件系统: 系统自动在内存中为每个文件开辟一个缓冲区 作为程序和磁盘文件数据交流的中间媒介 变量2、文件缓冲区 (内存)读(内在 1、打开文件文件 (写入缓冲区)磁盘) 写 3、关闭文件 (写入磁盘) 三步中的每一步都是通过C语言 的库函数实现 2
2 文件系统 ▪ 缓冲型文件系统: ▪ 系统自动在内存中为每个文件开辟一个缓冲区, 作为程序和磁盘文件数据交流的中间媒介. 3、关闭文件 (写入磁盘) 变量 (内存) 2、 读 写 文件 (磁盘) 1、打开文件 (写入缓冲区) 文件缓冲区 (内存) •三步中的每一步都是通过C语言 的库函数实现
与文件输入输出相关的库函数 include 打开: fopen 读/写 法宝:每个库函数在调用时可以查 TC: CTRL+F1 VC输入函数名即可看到函数形参。 文件定J针 rewind: fseeko: ftello: feofo 关闭: fclose
3 与文件输入输出相关的库函数 ▪ #include ▪ 打开:fopen(); ▪ 读/写: ▪ fgetc(); fputc(); ▪ fgets(); fputs(); ▪ fread(); fwrite(); ▪ fscanf(); fprintf(); ▪ 文件定位指针 ▪ rewind(); fseek(); ftell();feof(); ▪ 关闭:fclose(); •法宝:每个库函数在调用时可以查询。 •TC:CTRL+F1 •VC 输入函数名即可看到函数形参
要解决的问题1: 将学生信息存入文件,再从文件调入数组 #include *define n 30 struct sfu [char name[10]: int num Int age; char addr[15]:
4 要解决的问题1: 将学生信息存入文件,再从文件调入数组 #include #define N 30 struct stu {char name[10]; int num; int age; char addr[15]; };
1、输入学生信息存入数组 void maino FLLE类型是在 stdio.h文件中定义的 struct stu bo ty pede structi FILE fP int level: /缓冲区‘满’或‘空’的程度* unsigned flags /*文件状态标志* int i char fd; /*文件描述符 printf(" ninpy unsigned char hold;如无缓冲区不读字符 for(i=0, Pp= short bsize: /*缓冲区的大小 unsigned char *buffer;/数据缓冲区的位置* scanf( unsigned char *curp;/文件定位指针 >ge,pp-> a unsigned istemp;/临时文件指示器 short token; /*用于有效性检查* FILE:
5 1、输入学生信息存入数组 void main() {struct stu boya[N],boyb[N],*pp,*qq; FILE *fp; /*定义一个用于指向FILE类型的指针fp*/ int i; printf("\ninput data\n"); for(i=0,pp=boya;iname,&pp->num,&pp- >age,pp->addr); FILE类型是在stdio.h文件中定义的。 typedef struct{ int level; /*缓冲区‘满’或‘空’的程度*/ unsigned flags; /*文件状态标志*/ char fd; /*文件描述符*/ unsigned char hold; /*如无缓冲区不读字符*/ short bsize; /*缓冲区的大小*/ unsigned char *buffer;/*数据缓冲区的位置*/ unsigned char *curp; /*文件定位指针*/ unsigned istemp; /*临时文件指示器*/ short token; /*用于有效性检查*/ } FILE;
2、存入文件(打开文件->存储->关闭文件 先要打开文FLE帕open( char filename, char* type) if((fp=fopep u B FILE*fp= fopen ("C: IICONFIG SYS","rw"); printf filename是文件名 exit(1) 包含路径。如果不含路径,表示打开当前目录下 的文件 type是打开方式 °常用为"r、"w"、"rw"和"a",分别表示只读、 只写、读写和添加 ·“b”表示二进制文件,不写“b”表示文本文件 返回值为指向此文件的指针,留待以后使用 inta=30000 1.ASc码文件中存储格式 二者各有特点 ASC文件浪费空间和时间,直观 2二进制文件中存储格式:3 二进制文件节省空间和时间,不直观
6 2、存入文件(打开文件->存储->关闭文件) /*先要打开文件*/ if((fp=fopen("stu_list.dat","wb+"))==NULL) { printf("Cannot open file strike any key exit!"); exit(1); } ◼FILE *fopen(char *filename, char * type); –例:FILE *fp = fopen("C:\\CONFIG.SYS", "rw"); –filename是文件名 •包含路径。如果不含路径,表示打开当前目录下 的文件 –type是打开方式 •常用为"r"、"w"、"rw"和"a",分别表示只读、 只写、读写和添加 •“b”表示二进制文件,不写“b”表示文本文件 –返回值为指向此文件的指针,留待以后使用 int a=30000; –如果打开失败,返回值为NULL 1. ASCII码文件中存储格式:‘3’ , ‘0’ , ‘0’ , ‘0’ , ‘0’,(5个字节) 2. 二进制文件中存储格式:30000的补码(2个字节),即 11101010 01100000 二者各有特点: ASCII文件浪费空间和时间,直观 二进制文件节省空间和时间,不直观
int fprintf(FILE fp, char *format, arg1 2、存入y0 存入文件 ·函数功能:按照 forma给出的控制符格式,将变元 arg1,, argn的值写入到印p所指向的文件中去 for(i=0. Pp=br- fprintf(fp, %s %d %d %s\n". pp->name, pp->num, pp >age, pp->addr) 如果存储的全部是字符类型,也可以用 fwri Jint fputc(int c, FILE"fp) int fputs(char s, FILE " fp) 功能:将字符串写到指向的文件中去 成功时返回o,出错时返回EOF 例: fputs(" abcde",fp):/将字符串写到f指向的文件*/
7 2、存入文件(打开文件->存储->关闭文件) /*存入文件(输出到文件)*/ for(i=0,pp=boya;iname,pp->num,pp- >age,pp->addr); 如果存储的全部是字符类型,也可以用 fwrite( pp, sizeof(struct stu), 1, fp); •int fprintf(FILE *fp, char *format, arg1, …, argn) •函数功能:按照format给出的控制符格式,将变元 arg1,…,argn的值写入到fp所指向的文件中去 。 •unsigned fwrite(void *ptr,unsigned size,unsigned numb,FILE *fp); •函数功能:把从ptr开始的numb个size大小的数据块写入fp 指向的文件,函数调用成功返回count的值,否则返回-1。 •当写一个字符或一个字符串时,可用fputc()和fputs(). ◼int fputc(int c, FILE *fp); –功能:向fp输出字符c –若写入错误,则返回EOF,否则返回c –例:fputc(‘a’, fp); /*将字符a写到fp指向的文件*/ ▪int fputs(char *s, FILE *fp); ▪功能:将字符串写到fp指向的文件中去 ▪成功时返回0,出错时返回EOF ▪例:fputs(“abcde”, fp); /*将字符串写到fp指向的文件*/
2、存入文件(打开文件->存储->关闭文件) /最后关闭文件* fclose(fp) jint fclose (FILE fp): 函数功能:关闭文件,此时,印p不再指向文件在 内存的缓冲区。 返回值:关闭成功时返回值为0。否则(如磁盘空 间不足、写保护或关闭已经关闭的文件)返回EOF, 即-1
8 2、存入文件(打开文件->存储->关闭文件) /*最后关闭文件*/ fclose(fp); ◼int fclose(FILE *fp); •函数功能:关闭文件,此时,fp不再指向文件在 内存的缓冲区。 •返回值:关闭成功时返回值为0。否则(如磁盘空 间不足、写保护或关闭已经关闭的文件)返回EOF, 即-1
3、从文件读入到数组 (打开文件->读入到数组>关闭文件) if((fp=fopen ("stu_list. dat,rb D)==NULL) t printf"Cannot open file strike any key exit!): exit(2): for(=0geqq->报错都是以文件的形式来存储信息, printf \n\nname\tmu这三个标准设备文件分别是 qq=boy stdin stdout stderr for(i=0; inum, qq->age, q->adar. fclose(fp):
9 3、从文件读入到数组 (打开文件->读入到数组->关闭文件) if((fp=fopen("stu_list.dat","rb"))==NULL) { printf("Cannot open file strike any key exit!"); exit(2); } for(i=0;iname,&qq- >num,&qq->age,qq->addr); printf("\n\nname\tnumber age addr\n"); qq=boyb; for(i=0;iname,qq- >num, qq->age,qq->addr); fclose(fp); } •输出到stdout文件,即输出到屏幕。 •其实,从键盘输入、输出到屏幕与 报错都是以文件的形式来存储信息, 这三个标准设备文件分别是 stdin,stdout,stderr •从用户角度对文件分类,可分为两 类:标准设备文件和普通磁盘文件
要解决的问题2:复制文件 输入两个文件名 打开这两个文件 将一个文件的内容复制到另外一个文件 中 n关闭这两个文件 10
10 要解决的问题2:复制文件 ▪ 输入两个文件名 ▪ 打开这两个文件 ▪ 将一个文件的内容复制到另外一个文件 中 ▪ 关闭这两个文件