1、文件的相关操作字符读写函数 fgetc 和 fputc字符读写函数是以字符为单位的读写函数。 每次可从文件读出或向文件写入一个字符。1. 读字符函数 fgetcfgetc 函数的功能是从指定的文件中读出一个字符,函数调用的形式为:字符变量=fgetc(文件指针);例如:ch=fgetc(fp);其意义是从打开的文件 fp 中读取一个字符并送入 ch 中。对于 fgetc 函数的使用有以下几点说明:1) 在 fgetc 函数调用中,读取的文件必须是以读或读写方式打开的。2) 在文件内部有一个位置指针。用来指向文件的当前读写位置。在文件打开时,该指针总是指向文件的第一个字节。在读出或写入一个字符时
2、,该位置指针将向后移动一个字节。【例】读入文件 string.txt,在屏幕上输出。#includemain() FILE *fp;char ch;fp=fopen(“string.txt“,“r“)ch=fgetc(fp);while(ch!=EOF) /*EOF为文件结束标志,其值为-1*/ putchar(ch);ch=fgetc(fp);fclose(fp);2. 写字符函数 fputcfputc 函数的功能是把一个字符写入指定的文件中,函数调用的形式为:fputc(字符量,文件指针); 其中,待写入的字符量可以是字符常量或变量,例如:fputc(a,fp);其意义是把字符 a 写入
3、fp 所指向的文件中。【例】将一串字符串存放在文件 c1.doc 中。#includemain() FILE *fp;char ch;fp=fopen(“c1.doc“,“w“)ch=getchar();while(ch!=n) fputc(ch,fp);ch=getchar();fclose(fp);【例】将一个磁盘文件中的信息复制到另一个磁盘文件中。#include void main()FILE *in,*out; char ch,infile10,outfile10;printf(“请输入需要复制的文件名“);scanf(“%s“,infile);printf(“请输入新建的文件名“)
4、;scanf(“%s“,outfile);in=fopen(infile, “r“);out=fopen(outfile, “w“);while(!feof(in)fputc(fgetc(in),out);fclose(in);fclose(out);字符串读写函数 fgets 和 fputs1. 读字符串函数 fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为:fgets(字符数组名,n,文件指针);其中的 n 是一个正整数。表示从文件中读出的字符串不超过 n-1 个字符。在读入的最后一个字符后加上串结束标志0。【例】从 string 文件中读入一个含 10 个字
5、符的字符串。#includemain() FILE *fp;char str11;fp=fopen(“str.txt“,“r“);fgets(str,11,fp);printf(“n%sn“,str);fclose(fp);对 fgets 函数有两点说明:1) 在读出 n-1 个字符之前,如遇到了换行符或 EOF,则读出结束。2) fgets 函数也有返回值,其返回值是字符数组的首地址。2. 写字符串函数 fputsfputs 函数的功能是向指定的文件写入一个字符串,其调用形式为:fputs(字符串,文件指针);其中字符串可以是字符串常量,也可以是字符数组名,或指针变量。【例】在已建立的文件
6、string 中追加一个字符串。#includemain() FILE *fp;char ch,st20;fp=fopen(“string“,“a“);printf(“请输入字符串:n“);scanf(“%s“,st);fputs(st,fp);fclose(fp);数据块读写函数 fread 和 fwtrite语言还提供了用于整块数据的读写函数。可用来读写一组数据,如一个数组元素,一个结构变量的值等。读数据块函数调用的一般形式为:fread(buffer,size,count,fp);写数据块函数调用的一般形式为:fwrite(buffer,size,count,fp);其中:buffer
7、是一个指针,在 fread 函数中,它表示存放输入数据的首地址。在 fwrite 函数中,它表示存放输出数据的首地址。size 表示数据块的字节数。count 表示要读写的数据块块数。fp 表示文件指针。【例】从键盘输入两个学生数据,写入一个文件中,再读出这两个学生的数据显示在屏幕上。#includestruct stu char name10;int num;int age;char addr15;boya2,boyb2,*pp,*qq;main() FILE *fp;char ch;int i;pp=boya;qq=boyb;fp=fopen(“stu_list“,“wb+“);print
8、f(“n请输入数据n“);for(i=0;iname,pp=boya;fwrite(pp,sizeof(struct stu),2,fp);rewind(fp); /*此函数返回文件开头位置*/fread(qq,sizeof(struct stu),2,fp);printf(“nnnametnumber age addrn“);for(i=0;iname,qq-num,qq-age,qq-addr);fclose(fp);格式化读写函数 fscanf 和 fprintffscanf 函数,fprintf 函数与前面使用的 scanf 和 printf 函数的功能相似,都是格式化读写函数。两者的
9、区别在于 fscanf 函数和 fprintf 函数的读写对象不是键盘和显示器,而是磁盘文件。这两个函数的调用格式为:fscanf(文件指针,格式字符串,输入表列);fprintf(文件指针,格式字符串,输出表列);【例】从键盘输入两个学生数据,写入一个文件中,再读出这两个学生的数据显示在屏幕上。#includestruct stu char name10;int num;int age;char addr15;boya2,boyb2,*pp,*qq;main() FILE *fp;char ch;int i;pp=boya;qq=boyb;fp=fopen(“stu_list“,“wb+“)
10、;printf(“n 请输入数据n“);for(i=0;iname,pp=boya;for(i=0;iname,pp-num,pp-age,pp-addr);rewind(fp);for(i=0;iname,printf(“nnnametnumber age addrn“);qq=boyb;for(i=0;iname,qq-num, qq-age,qq-addr);fclose(fp);文件的随机读写前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个数据。 但在实际问题中常要求只读写文件中某一指定的部分。为了解决这个问题可移动文件内部的位置指针到需要读写的位置,再进行
11、读写,这种读写称为随机读写。文件定位移动文件内部位置指针的函数主要有两个,即 rewind 函数和 fseek 函数。rewind 函数调用形式: rewind(文件指针);功能:是把文件内部的位置指针移到文件首。fseek 函数调用形式: fseek(文件指针,位移量,起始点);功能:fseek 函数用来移动文件内部位置指针说明:“文件指针”指向被移动的文件。“位移量” 表示移动的字节数,要求位移量是 long 型数据,以便在文件长度大于 64KB 时不会出错。当用常量表示位移量时,要求加后缀“L” 。“起始点” 表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。其表示方法如下表。起始点 表示符号 数字表示文件首 SEEK_SET 0当前位置 SEEK_CUR 1文件末尾 SEEK_END 2例如:fseek(fp,100L,0);其意义是把位置指针移到离文件首 100 个字节处。文件结束检测函数 feof 函数调用格式: feof(文件指针);功能:判断文件是否处于文件结束位置,如文件结束,则返回值为 1,否则为 0。