第十三章文件 13.1C文件概述 1.文件:存储在外部介质上的数据的集合。 2ASCI码文件(文本文件) 每个字符以ASCI码形势存储。 3二进制文件 按数据的二进制形式存储在磁盘上 例如:10000是整型数据,用二进制表示占两个字节,如用ASCI 码输出,则占五个字节。 10000 0010011100010000 00l100010011000000l1000000l1000000110000 4.文件流:一连串的字节或字符,不考虑记录的界限。 13.2文件的打开与关闭 1.文件打开函数 fopen:入口参数文件名和调用方式 例:FIE*f;∥说明一个文件类指针 fp=fopen("myfile. dat","r) 文件使用方式 省义 r7(只读) 为输入打开一个文本文件 “w(只写 为输出打开一个文本文件 “a(追加 向文本文件末尾增加数据 rb℃(只读)为输入打开一个二进制文件 (只写 为输出打开一个二进制文件 ab(追加 向二进制文件末尾增加数据 T+(读写) 为读/写打开一个文本文件 w+(读写) 为读/写建立一个新的文本文件 a+ˇ(读写) 为读/写打开一个文本文件 “rb+读写) 为读/写打开一个二进制文件 wb+”(读写 读/写建立一个新的二进制文件 ab+?(读写 为读/写打开一个二进制文件 2关闭文件函数 fclose 使用完文件后应当关闭它,系统把缓冲区的内容写回文件,然
第十三章 文 件 13.1 C 文件概述 1.文件:存储在外部介质上的数据的集合。 2.ASCII 码文件(文本文件): 每个字符以 ASCII 码形势存储。 3.二进制文件 按数据的二进制形式存储在磁盘上 例如:10000 是整型数据,用二进制表示占两个字节,如用 ASCII 码输出,则占五个字节。 10000 00100111 00010000 00110001 00110000 00110000 00110000 00110000 4.文件流:一连串的字节或字符,不考虑记录的界限。 13.2 文件的打开与关闭 1.文件打开函数 fopen(): 入口参数文件名和调用方式 例:FILE *fp; //说明一个文件类指针. fp=fopen("myfile.dat","r"); 文件使用方式 含义 “r”(只读) 为输入打开一个文本文件 “w”(只写) 为输出打开一个文本文件 “a”(追加) 向文本文件末尾增加数据 “rb”(只读) 为输入打开一个二进制文件 “wb”(只写) 为输出打开一个二进制文件 “ab”(追加) 向二进制文件末尾增加数据 “r+”(读写) 为读/写打开一个文本文件 “w+”(读写) 为读/写建立一个新的文本文件 “a+”(读写) 为读/写打开一个文本文件 “rb+”(读写) 为读/写打开一个二进制文件 “wb+”(读写) 读/写建立一个新的二进制文件 “ab+”(读写) 为读/写打开一个二进制文件 2 关闭文件函数 fclose ⚫ 使用完文件后应当关闭它,系统把缓冲区的内容写回文件,然
后将文件指针变量与该文件“脱钩 关闭文件使用函数 fclose,它的原型为 int fclose(file"fp) 该函数关闭印指向的文件。如果文件正常关闭将返回0值;如 果关闭文件失败则返回非0值。 133文件的读写 向文件中写数据 1 fputc(函数 fputc的原型为 It fputc(int ch, FILE*fp); 此函数会将字符ch写入印指向的文件 若操作成功则返回ch的值 若操作失败则返回EOF(-1) 通常用于将一个字符写入一个文本文件。 例13.1从键盘上送入一些字符,存到磁盘中,#”为结束符。 # include“ stdio. h maino f FILEfp; char ch, filename[10 scanf(%os", filename if ((fp=fopen (filename, w)=null) i printf("can not open filen) xit(o) ch=getchar hile(ch=#”){ fputc(ch, p) fclose(fp); 2. fwrite函数 函数原型 unsigned fwrite(void *buffer, unsignedsize unsigned count, FILE fp) ·功能:将buer所指向的内存单元开始的内存区中的每项长度 为sie字节的 count个数据项写到印指向的文件中 此函数主要用于二进制文件的写操作,可以将一个数组的数据 写入文件中
后将文件指针变量与该文件“脱钩”。 ⚫ 关闭文件使用函数 fclose,它的原型为 int fclose(FILE *fp); ⚫ 该函数关闭 fp 指向的文件。如果文件正常关闭将返回 0 值;如 果关闭文件失败则返回非 0 值。 13.3 文件的读写 一.向文件中写数据 1.fputc( )函数. ⚫ fputc 的原型为 ⚫ int fputc(int ch, FILE *fp); ⚫ 此函数会将字符 ch 写入 fp 指向的文件。 若操作成功则返回 ch 的值; 若操作失败则返回 EOF(-1)。 ⚫ 通常用于将一个字符写入一个文本文件。 [例 13.1] 从键盘上送入一些字符,存到磁盘中,“#”为结束符。 #include “stdio.h” main() { FILE *fp; char ch,filename[10]; scanf(“%s”,filename); if ((fp=fopen(filename,”w”))==null) { printf(“can not open file\n”); exit(0); } ch=getchar(); while(ch!=’#’) { fputc(ch,fp); ch=getchar(); } fclose(fp); } 2. fwrite 函数 • 函数原型: – unsigned fwrite(void *buffer, unsigned size, unsigned count, FILE *fp); • 功能:将 buffer 所指向的内存单元开始的内存区中的每项长度 为 size 字节的 count 个数据项写到 fp 指向的文件中。 • 此函数主要用于二进制文件的写操作,可以将一个数组的数据 写入文件中
例13.2 建立一个二进制文件 score dat,存放某班32名同学某门课的成(每 名同学要求有学号和成绩两个数据项。 #include struct struct name Int num ber Int score, Astudents32 maino FILE*fp; int 1 (fp=fopen("score. dat","wb")==NULL printf("Cannot open file score. dat! \ n") exit(o) for(i=0;1<32;i++) o.scanf("%d %d", &students[i]. number, &students[i].score); fwrite(&students[il, sizeof(struct struct name), l, fp) fclose(fp 第二个for循环也可以用以下语句实现: fwrite(students, sizeof(struct struct name), 32, fp); 从文件中读取数据 1. fgetc函数 getc的原型为 int fgetc(FILE *fp) 功能 从文件的当前位置读出一个字符 将位置指针下移一个字符 若读取成功则返回所读的字符;若发生错误或文件结束则返回 EOF(-1)。 2 fread函数
例 13.2 建立一个二进制文件score.dat,存放某班32 名同学某门课的成(每 名同学要求有学号和成绩两个数据项。 #include struct struct_name { int number; int score; }students[32]; main() { FILE *fp; int i; if((fp=fopen("score.dat","wb"))==NULL) { printf("Cannot open file score.dat!\n"); exit(0); } for(i=0;i<32;i++) scanf("%d%d",&students[i].number,&students[i].score); for(i=0;i<32;i++) fwrite(&students[i],sizeof(struct struct_name),1,fp); fclose(fp); } 第二个 for 循环也可以用以下语句实现: fwrite(students,sizeof(struct struct_name),32,fp); 二.从文件中读取数据 1. fgetc 函数 • fgetc 的原型为 – int fgetc(FILE *fp); • 功能: – 从文件的当前位置读出一个字符 – 将位置指针下移一个字符 • 若读取成功则返回所读的字符;若发生错误或文件结束则返回 EOF(-1)。 2. fread 函数
· fread的原型为 unsigned fread(void*buffer, unsigned size unsigned count, FILE* fp) ·功能:从文件中读取每项长度为size字节的 count个数据项 存到 buffer所指向的内存单元开始的内存区中
• fread 的原型为 – unsigned fread(void *buffer, unsigned size; unsigned count, FILE *fp); • 功能:从文件中读取每项长度为 size 字节的 count 个数据项, 存到 buffer 所指向的内存单元开始的内存区中