【高级语言程序设计(一)】第 10 章:文件 |
您所在的位置:网站首页 › 用fopen打开的文件file可以进行修改 › 【高级语言程序设计(一)】第 10 章:文件 |
目录 一、文件概述 (1)文件定义 (2)文件命名 (3)文件分类 ① 按照文件的内容划分 ② 按照文件的组织形式划分 ③ 按照文件的存储形式划分 ④ 按照文件的存储介质划分 (4)文件存取方式 (5)文件系统 二、文件的打开和关闭函数 (1)文件打开函数 ① 库函数 exit() 的具体说明 ② 文件使用中各字符的含义 ③ 文件的使用方式说明 (2)文件关闭函数 (3)标准设备文件的打开和关闭 ① 文件的打开与关闭 ② 文件的打开(fopen 函数) ③ 文件的关闭(fclose 函数) 三、文件的读/写函数 (1)文件尾测试函数 (2)写字符函数 fputc() (3)读字符函数 fgetc() ① fputc 函数(putc 函数) ② fgetc 函数(getc 函数) ③ feof 函数 (4)写字符串函数 fputs() (5)读字符串函数 fgets() (6)写数据块函数 fwrite() (7)读数据块函数 fread() (8)格式化写函数 fprintf() (9)格式化读函数 fscanf() 四、文件的定位函数 (1)文件指针复位函数 ① rewind 函数 (2)文件随机定位函数 (3)文件随机定位函数 一、文件概述C 语言将文件看做是由一个一个的字符(ASCII码文件)或字节(二进制文件)组成的,这种文件称为流式文件。 (1)文件定义 文件是存储在外部存储介质上的数据集合,这些数据的类型可以是整型、实型、字符型、字符串或结构体类型等。目前,外部存储介质主要是磁盘,存储在磁盘上的文件称为“磁盘文件” 。 (2)文件命名 为了标识磁盘上的不同文件,每个磁盘文件都必须有一个文件名,其一般组成为: 盘符:路径\文件主名[.扩展名] 其中,盘符表示文件所在的磁盘,可以是 A、B、C 和 D 等。路径是由目录序列组成,目录之间的分隔符为 “\” ,需要注意的是,如果路径出现在字符串中,C 语言规定其中的符号 “\” 需要写成转义字符 “\\” 。文件主名和扩展名均是由字母和数字等字符组成的。 C 语言中,常见的扩展名: c:C 源程序文件 obj:C 源程序经过编译后生成的目标文件exe:目标文件经过链接后生成的可执行文件一般地,数据文件的扩展名常用 dat ,文本文件的扩展名常用 txt (3)文件分类 ① 按照文件的内容划分可分为程序文件和数据文件 程序文件:又可以分为源文件、目标文件和可执行文件 ② 按照文件的组织形式划分 可分为顺序存取文件和随机存取文件 顺序存取文件:简称为 “顺序文件” ,数据写入文件的方式是后输入的数据放在以前输入数据的后面,按照数据的先后次序一个接一个地存放。 随机存取文件:简称为 “随机文件” ,每个数据在磁盘中所占用的长度都相同。 ③ 按照文件的存储形式划分 可分为文本文件和二进制文件 文本文件:文本文件中数据转换为对应的ASCⅡ码来存放,每字节存储一个字符,因此便于对字符逐一进行处理。 二进制文件:二进制文件中数据按照其二进制形式来存放,即把内存中的数据,原样输出到磁盘文件中。 ④ 按照文件的存储介质划分 可以分为普通文件和设备文件 普通文件:即存储介质文件(磁盘、磁带等) 设备文件:即非存储介质文件(键盘、 显示器和打印机等) (4)文件存取方式 主要包括顺序存取和随机存取两种 顺序存取:是自上而下逐一地存取文件的内容。保存数据时,将数据附加到文件的尾部。顺序存取方式常用于文本文件,被存取的文件则称为顺序文件。 随机存取:是以一个完整的单位进行数据的读取和写入。随机存取方式常用于二进制文件,被存取的文件则称为随机文件。 (5)文件系统 C 语言使用的文件系统分为缓冲文件系统(标准I/O)和非缓冲文件系统(系统I/O): 缓冲文件系统:是指系统自动地为每个正在使用的文件在内存开辟一个缓冲区。从内存向磁盘输出数据时,必须首先输出到缓冲区。待缓冲区装满后,再一起输出到磁盘文件。从磁盘文件文件向内存读入数据时,恰好相反,即首先将一批数据读入到缓冲区,再从缓冲区将数据逐一送到程序数据区。![]() C 文件操作用库函数实现,包含在 stdio.h 文件使用方式 : 打开文件 → 文件读 / 写 → 关闭文件 系统 自动 打开和关闭三个 标准文件 : 标准输入 ------------- 键盘 stdin 标准输出 ------------- 显示器 stdout 标准出错输出 ------- 显示器 stderr ② 文件的打开(fopen 函数) 【函数原型】 FILE * fopen (char * name , char * mode ) 【调用方式】fopen(" 文件名 " , " 使用文件方式 ") 【示例】 FILE *fp; fp=fopen("d:\\user\\myfile.txt", "r");【返回值】正常打开,返回指向文件结构体的指针;打开失败,返回 NULL FILE *fp; fp=fopen("aa.c", "w"); if(fp==NULL) { printf("File open error!\n"); exit(0); /* 关闭所有文件终止调用 */ }【注意】 r:读方式w:写方式a:追加方式rb / wb / ab:二进制方式+:既可读又可写 字符处理方式指定文件不存在文件存在r只读出错正常w只写建立新文件原内容丢失a追加建立新文件在原内容后追加r+/w+读写出错正常 ③ 文件的关闭(fclose 函数) 【作用】 使文件指针变量与文件 “脱钩” ,释放文件结构体和文件指针 FILE *fp; fp=fopen("a.txt", "r"); fclose(fp);【返回值】用于表示文件是否被正确地关闭,如果文件顺利关闭,该值为0,否则为 -1(EOF) 返回值可以用 ferror 函数测试 三、文件的读/写函数 (1)文件尾测试函数 文件执行读操作时,通常使用 feof() 函数来判断是否到达文件尾如果遇到文件尾,则不能继续读取数据 【函数首部】 int feof(FILE *fp) 【参数】fp 文件型指针,通过 fopen() 函数获得,指向一个已经打开的文件 【功能】判断 fp 所指向的文件是否到达文件尾 【返回值】若遇到文件尾,则返回值是非 0 ;否则,返回值是 0 feof() 函数同时适用于文本文件和二进制文件对二进制文件执行读操作时,必须使用 feof() 函数来判断是否到达文件尾对文本文件执行读操作时,如果遇到文件尾,则返回一个文件结束标志EOF(EOF 是一个符号常量,其值在头文件 stdio.h 中被定义为 -1,含义是 “文件尾”) (2)写字符函数 fputc() 【函数首部】int fputc(char ch, FILE *fp) 【参数】 ch 写到文件中的字符,既可以是字符常量,也可以是字符变量或字符表达式fp 文件型指针,通过函数 fopen() 获得,且指向一个已经打开的文件 【功能】将 ch 中的字符写到 fp 所指向文件的当前位置,同时将读/写位置指针后移 1 字节,即指向下一个读/写位置 【返回值】若正确写入字符,则返回刚写入到文件的字符;否则,返回 EOF 本函数主要用于文本文件,也可以用于二进制文件对于文本文件,写入的是单个字符对于二进制文件,写入的是 1 字节数据。当正确地写入一个字符或 1 字节数据后,文件内部的读/写位置指针会后移 1 字节,即指向下一个读/写位置 (3)读字符函数 fgetc() 【函数首部】 int fgetc(FILE *fp) 【参数】fp 文件型指针,通过函数 fopen() 获得,指向一个已经打开的文件 【功能】从 fp 所指向文件的当前位置读取一个字符,同时将读/写位置指针后移 1 字节,即指向下一个读/写位置 【返回值】若正确读取字符,则返回读取的单个字符;否则,返回 EOF 文件的读写: 文件打开之后,就可以对它进行读与写的操作了 读/写文件中的 一个字符 : fputc 函数(putc 函数) fgetc 函数(getc 函数) feof 函数 ① fputc 函数(putc 函数) 【函数原型】 int fputc(int c, FILE *fp) c :字符常量或变量*fb :文件指针变量 【功能】把一字节代码 c 写入 fp 指向的文件中 【返值】 正常,返回 c ; 出错,为 EOF ( -1 ) ② fgetc 函数(getc 函数) 【函数原型】 int fgetc(FILE *fp) *fb :文件指针变量 【功能】从 fp 指向的文件中读取一字节代码 【返值】 返回读到的代码值 ; 读到文件尾或出错为 EOF ( -1 ) ③ feof 函数 【函数原型】 feof(fp) 【功能】 对于二进制文件读取时判断文件是否结束 【返值】结束 -1 ;反之 0 /* 示例:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个 “#” 为止 */ #include #include void main() { FILE *fp; char ch , filename[10]; scanf("%s", filename); if((fp=fopen(filename, "w"))==NULL) { printf("cannot open file\n"); exit(0); } /* 终止程序 */ ch=getchar(); /* 接收执行scanf时最后输入的回车符 */ ch=getchar(); /* 第一个输入的字符被赋给变量ch */ while(ch!='#') { fputc(ch, fp); /* 字符被写入filename表示的文件中 */ putchar(ch); /* 字符被输出到显示器 */ ch=getchar(); } putchar(10); /* 向屏幕输出一个换行符 */ fclose(fp); } /* 关闭文件 */ (4)写字符串函数 fputs() 【函数首部】 int fputs(char *str, FILE *fp) 【参数】 str 字符型指针,可以是一个字符常量,或字符数组名,或字符指针变量名fp 文件型指针,通过函数 fopen() 获得,指向一个已经打开的文件 【功能】 把 str 所指向的一个字符串,舍去字符串结束标志符 ‘\0’ 后写入 fp 所指向文件的当前位置同时将读/写位置指针向后移动 strlen(字符串长度)字节 【返回值】若正确写入字符串,则返回写入文件的实际字符数;否则,返回 EOF (5)读字符串函数 fgets() 【函数首部】 char *fgets(char *str, int length, FILE *fp) 【参数】 str 字符型指针,可以是一个字符数组名,或字符指针变量名length 整型,可以是整型常量、变量或表达式fp 文件型指针,通过函数 fopen() 获得,指向一个已经打开的文件 【功能】 从 fp 所指向文件的当前位置读入一个字符串,即读取 length-1 个字符,并在尾部自动补充一个字符串结束标志符 ‘\0’ ,组成字符串后存入 str 所指定的内存区;同时,将读/写位置指针后移实际读出的字符个数字节。如果在读取前 n-1 个字符中遇到文件尾 EOF 或回车,则读取结束,并在读取的字符后面补充一个字符串结束标志符 ‘\0’ 组成字符串。 【返回值】若正确读取字符串,则返回 str 对应的地址;否则,返回 NULL /* 示例:从键盘读入字符串存入文件,再从文件读回显示 */ #include void 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); } (6)写数据块函数 fwrite() 【函数首部】 int fwrite(void *buffer, int size, int count, FILE *fp) 【参数】 buffer 字符型指针,存放写入文件数据类型的起始地址,可以是存放数据的变量地址或数组首地址,也可以是指向某个变量或数组的指针变量。 size 无符号整数,可以是整型常量、变量或表达式,表示从文件写入文件的每个数据所占用的字节数,通常使用表达式 sizeof(数据类型符)。 count 无符号整数,可以是整型常量、变量或表达式,表示要写入文件的数据的个数。 fp 文件型指针,通过函数 fopen() 获得,指向一个已经打开的可写文件。 【功能】 将从 buffer 开始的 count 个数据(每个数据占用 size 字节)一次性写入 fp 所指向的文件同时,将读/写位置指针后移 size*count 字节 【返回值】若正确写入数据块,则返回值是 count;否则,返回值是 0 (7)读数据块函数 fread() 【函数首部】 int fread(void *buffer, int size, int count, FILE *fp) 【参数】 buffer 字符型指针,存放从文件中读取数据的起始地址,可以是存放数据的变量地址或数组首地址,也可以是指向某个变量或数组的指针变量size 无符号整数,可以是整型常量、变量或表达式,表示从文件读取的每个数据所占用的字节数,通常使用表达式 sizeof(数据类型符)count 无符号整数,可以是整型常量、变量或表达式,表示从文件中读取数据的个数fp 文件型指针,通过函数 fopen() 获得,指向一个已经打开的可读文件 【功能】 从 fp 所指向文件的当前位置开始,一次性读入 count 个数据(每个数据占用 size 字节),并将读入的数据存放到以 buffer 为首地址的内存区同时,将读/写位置指针后移 size*count字节 【返回值】若正确读取数据块,则返回值是 count;否则,返回值是 0 【注意】用 fread() 和 fwrite() 函数进行数据读/写时,必须采用二进制 (8)格式化写函数 fprintf() 【函数首部】int fprintf(FILE *fp, char *format[, argument…]) 【参数】 fp 文件型指针,通过函数 fopen() 获得,指向一个已经打开的可写文件format 格式字符串argument 输出列表 【功能】将 argument 的值以 format 指定的格式写入 fp 所指向的文件 【返回值】若正确写入数据,则返回实际输出字符的个数;否则,返回值是负数 (9)格式化读函数 fscanf() 【函数首部】 int fscanf(FILE *fp, char *format[, argument…]) 【参数】 fp 文件型指针,通过函数 fopen() 获得,指向一个已经打开的可读文件format 格式字符串argument 输入列表 【功能】根据 format 指定的格式从 fp 所指向文件中读取数据保存至 argument 所指向的内存单元 【返回值】若正确读入数据,则返回值是已读入的数据个数;否则,返回值是 EOF 四、文件的定位函数 (1)文件指针复位函数 【函数首部】 int rewind(FILE *fp) 【参数】fp 文件型指针,通过函数 fopen() 获得,指向一个已经打开的文件 【功能】将 fp 所指向文件的位置指针 重置到文件头 ,即把文件的位置指针重新定位到 fp 所指向文件的起始位置 【返回值】 若执行正常,返回值是 0 ;否则,返回值是非 0 ① rewind 函数 【函数原型】 void rewind(FILE *fp) 【功能】重置文件位置指针到文件开头 【返回值】 无 /* 示例:对一个磁盘文件进行显示和复制两次操作 */ #include void main() { FILE *fp1, *fp2; fp1=fopen("c:\\c\\user\\ch4.c", "r"); fp2=fopen("d:\\c\\user\\ch41.c", "w"); while(!feof(fp1)) putchar(fgetc(fp1)); rewind(fp1); while(!feof(fp1)) putc(fgetc(fp1), fp2); fclose(fp1); fclose(fp2); } (2)文件随机定位函数 文件随机定位函数: 文件随机定位函数 fseek() 可以将文件的位置指针移动到文件中的任何一个地方,一般用于二进制。 【函数首部】 int fseek(FILE *fp, long offset, int origin) 【参数】 fp 文件型指针,通过函数 fopen() 获得,指向一个已经打开的文件offset 长整型数据,表示位移量,是从 origin 为起始位置,向后(当位移量>0时)或向前(当位移量 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |