C语⾔中file⽂件指针概念及其操作(转载)
⽂件
⽂件的基本概念
  所谓“⽂件”是指⼀组相关数据的有序集合。这个数据集有⼀个名称,叫做⽂件名。实际上在前⾯的各章中我们已经多次使⽤了⽂件,例如源程序⽂件、⽬标⽂件、可执⾏⽂件、库⽂件 (头⽂件)等。⽂件通常是驻留在外部介质(如磁盘等)上的,在使⽤时才调⼊内存中来。从不同的⾓度可对⽂件作不同的分类。从⽤户的⾓度看,⽂件可分为普通⽂件和设备⽂件两种。
  普通⽂件是指驻留在磁盘或其它外部介质上的⼀个有序数据集,可以是源⽂件、⽬标⽂件、可执⾏程序;也可以是⼀组待输⼊处理的原始数据,或者是⼀组输出的结果。对于源⽂件、⽬标⽂件、可执⾏程序可以称作程序⽂件,对输⼊输出数据可称作数据⽂件。
  设备⽂件是指与主机相联的各种外部设备,如显⽰器、打印机、键盘等。在操作系统中,把外部设备也看作是⼀个⽂件来进⾏管理,把它们的输⼊、输出等同于对磁盘⽂件的读和写。通常把显⽰器定义为标准输出⽂件,⼀般情况下在屏幕上显⽰有关信息就是向标准输出⽂件输出。如前⾯经常使⽤的printf,putchar 函数就是这类输出。键盘通常被指定标准的输⼊⽂件,从键盘上输⼊就意味着从标准输⼊⽂件上输⼊数据。scanf,getchar函数就属于这类输⼊。
  从⽂件编码的⽅式来看,⽂件可分为ASCII码⽂件和⼆进制码⽂件两种。
  ASCII⽂件也称为⽂本⽂件,这种⽂件在磁盘中存放时每个字符对应⼀个字节,⽤于存放对应的ASCII码。例如,数5678的存储形式为:
ASC码: 00110101 00110110 00110111 00111000putchar函数
     ↓    ↓    ↓   ↓
⼗进制码: 5     6    7    8 共占⽤4个字节。ASCII码⽂件可在屏幕上按字符显⽰,例如源程序⽂件就是ASCII⽂件,⽤DOS命令TYPE可显⽰⽂件的内容。由于是按字符显⽰,因此能读懂⽂件内容。
  ⼆进制⽂件是按⼆进制的编码⽅式来存放⽂件的。例如,数5678的存储形式为: 00010110 00101110只占⼆个字节。⼆进制⽂件虽然也可在屏幕上显⽰,但其内容⽆法读懂。C系统在处理这些⽂件时,并不区分类型,都看成是字符流,按字节进⾏处理。输⼊输出字符流的开始和结束只由程序控制⽽不受物理符号(如回车符)的控制。因此也把这种⽂件称作“流式⽂件”。
  本章讨论流式⽂件的打开、关闭、读、写、定位等各种操作。⽂件指针在C语⾔中⽤⼀个指针变量指向⼀个⽂件,这个指针称为⽂件指针。通过⽂件指针就可对它所指的⽂件进⾏各种操作。定义说明⽂件指针的⼀般形式为: FILE* 指针变量标识符;其中FILE应为⼤写,它实际上是由系统定义的⼀个结
构,该结构中含有⽂件名、⽂件状态和⽂件当前位置等信息。在编写源程序时不必关⼼FILE结构的细节。例如:FILE *fp;表⽰fp是指向FILE结构的指针变量,通过fp 即可存放某个⽂件信息的结构变量,然后按结构变量提供的信息到该⽂件,实施对⽂件的操作。习惯上也笼统地把fp称为指向⼀个⽂件的指针。⽂件的打开与关闭⽂件在进⾏读写操作之前要先打开,使⽤完毕要关闭。所谓打开⽂件,实际上是建⽴⽂件的各种有关信息,并使⽂件指针指向该⽂件,以便进⾏其它操作。关闭⽂件则断开指针与⽂件之间的联系,也就禁⽌再对该⽂件进⾏操作。
  在C语⾔中,⽂件操作都是由库函数来完成的。在本章内将介绍主要的⽂件操作函数。
⽂件打开函数fopen
  fopen函数⽤来打开⼀个⽂件,其调⽤的⼀般形式为:⽂件指针名=fopen(⽂件名,使⽤⽂件⽅式) 其中,“⽂件指针名”必须是被说明为FILE 类型的指针变量,“⽂件名”是被打开⽂件的⽂件名。 “使⽤⽂件⽅式”是指⽂件的类型和操作要求。“⽂件名”是字符串常量或字符串数组。例如:
FILE *fp;
fp=("file a","r");
其意义是在当前⽬录下打开⽂件file a,只允许进⾏“读”操作,并使fp指向该⽂件。
⼜如:
FILE *fphzk
fphzk=("c:\\hzk16',"rb")
其意义是打开C驱动器磁盘的根⽬录下的⽂件hzk16,这是⼀个⼆进制⽂件,只允许按⼆进制⽅式进⾏读操作。两个反斜线“\ ”中的第⼀个表⽰转义字符,第⼆个表⽰根⽬录。使⽤⽂件的⽅式共有12种,下⾯给出了它们的符号和意义。
⽂件使⽤⽅式       意义
“rt”      只读打开⼀个⽂本⽂件,只允许读数据
“wt”      只写打开或建⽴⼀个⽂本⽂件,只允许写数据
“at”      追加打开⼀个⽂本⽂件,并在⽂件末尾写数据
“rb”      只读打开⼀个⼆进制⽂件,只允许读数据
“wb”     只写打开或建⽴⼀个⼆进制⽂件,只允许写数据
“ab”      追加打开⼀个⼆进制⽂件,并在⽂件末尾写数据
“rt+”     读写打开⼀个⽂本⽂件,允许读和写
“wt+”     读写打开或建⽴⼀个⽂本⽂件,允许读写
“at+”     读写打开⼀个⽂本⽂件,允许读,或在⽂件末追加数据
“rb+”     读写打开⼀个⼆进制⽂件,允许读和写
“wb+”     读写打开或建⽴⼀个⼆进制⽂件,允许读和写
“ab+”      读写打开⼀个⼆进制⽂件,允许读,或在⽂件末追加数据
对于⽂件使⽤⽅式有以下⼏点说明:
1. ⽂件使⽤⽅式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
r(read): 读
w(write): 写
a(append): 追加
t(text): ⽂本⽂件,可省略不写
b(banary): ⼆进制⽂件
+: 读和写
2. 凡⽤“r”打开⼀个⽂件时,该⽂件必须已经存在,且只能从该⽂件读出。
3. ⽤“w”打开的⽂件只能向该⽂件写⼊。若打开的⽂件不存在,则以指定的⽂件名建⽴该⽂件,若打开的⽂件已经存在,则将该⽂件删去,重建⼀个新⽂件。
4. 若要向⼀个已存在的⽂件追加新的信息,只能⽤“a ”⽅式打开⽂件。但此时该⽂件必须是存在的,否则将会出错。
5. 在打开⼀个⽂件时,如果出错,fopen将返回⼀个空指针值NULL。在程序中可以⽤这⼀信息来判别是否完成打开⽂件的⼯作,并作相应的处理。因此常⽤以下程序段打开⽂件:
if((fp=fopen("c:\hzk16","rb")==NULL)
{
printf("error on open c:\hzk16 file!");
getch();
exit(1);
}
  这段程序的意义是,如果返回的指针为空,表⽰不能打开C盘根⽬录下的hzk16⽂件,则给出提⽰信息“error on open c: hzk16file!”,下⼀⾏getch()的功能是从键盘输⼊⼀个字符,但不在屏幕上显⽰。在这⾥,该⾏的作⽤是等待,只有当⽤户从键盘敲任⼀键时,程序才继续执⾏,因此⽤户可利⽤这个等待时间阅读出错提⽰。敲键后执⾏exit(1)退出程序。
6. 把⼀个⽂本⽂件读⼊内存时,要将ASCII码转换成⼆进制码,⽽把⽂件以⽂本⽅式写⼊磁盘时,也要把⼆进制码转换成ASCII码,因此⽂本⽂件的读写要花费较多的转换时间。对⼆进制⽂件的读写不存在这种转换。
7. 标准输⼊⽂件(键盘),标准输出⽂件(显⽰器 ),标准出错输出(出错信息)是由系统打开的,可直接使
⽤。⽂件关闭函数fclose()⽂件⼀旦使⽤完毕,应⽤关闭⽂件函数把⽂件关闭,以避免⽂件的数据丢失等错误。
fclose函数
调⽤的⼀般形式是: fclose(⽂件指针);例如:
fclose(fp); 正常完成关闭⽂件操作时,fclose函数返回值为0。如返回⾮零值则表⽰有错误发⽣。⽂件的读写对⽂件的读和写是最常⽤的⽂件操作。
在C语⾔中提供了多种⽂件读写的函数:
·字符读写函数:fgetc和fputc
·字符串读写函数:fgets和fputs
·数据块读写函数:freed和fwrite
·格式化读写函数:fscanf和fprinf
  下⾯分别予以介绍。使⽤以上函数都要求包含头⽂件stdio.h。字符读写函数fgetc和fputc
字符读写函数是以字符(字节)为单位的读写函数。每次可从⽂件读出或向⽂件写⼊⼀个字符。
⼀、读字符函数fgetc
  fgetc函数的功能是从指定的⽂件中读⼀个字符,函数调⽤的形式为:字符变量=fgetc(⽂件指针);例如:ch=fgetc(fp);其意义是从打开的⽂件fp中读取⼀个字符并送⼊ch中。
  对于fgetc函数的使⽤有以下⼏点说明:
1. 在fgetc函数调⽤中,读取的⽂件必须是以读或读写⽅式打开的。
2. 读取字符的结果也可以不向字符变量赋值,例如:fgetc(fp);但是读出的字符不能保存。
3. 在⽂件内部有⼀个位置指针。⽤来指向⽂件的当前读写字节。在⽂件打开时,该指针总是指向⽂件的第⼀个字节。使⽤fgetc 函数后,该位置指针将向后移动⼀个字节。因此可连续多次使⽤fgetc函数,读取多个字符。应注意⽂件指针和⽂件内部的位置指针不是⼀回事。⽂件指针是指向整个⽂件的,须在程序中定义说明,只要不重新赋值,⽂件指针的值是不变的。⽂件内部的位置指针⽤以指⽰⽂件内部的当前读写位置,每读写⼀次,该指针均向后移动,它不需在程序中定义说明,⽽是由系统⾃动设置的。
[例]读⼊⽂件e10-1.c,在屏幕上输出。
#include<stdio.h>
main()
{
FILE *fp;
char ch;
if((fp=fopen("e10_1.c","rt"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
ch=fgetc(fp);
while (ch != EOF)
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
}
  本例程序的功能是从⽂件中逐个读取字符,在屏幕上显⽰。程序定义了⽂件指针fp,以读⽂本⽂件⽅式打开⽂件“e10_1.c”,并使fp指向该⽂件。如打开⽂件出错,给出提⽰并退出程序。程序第12⾏先读出⼀个字符,然后进⼊循环,只要读出的字符不是⽂件结束标志(每个⽂件末有⼀结束标志EOF)就把该字符显⽰在屏幕上,再读⼊下⼀字符。每读⼀次,⽂件内部的位置指针向后移动⼀个字符,⽂件结束时,该指针指向EOF。执⾏本程序将显⽰整个⽂件。
⼆、写字符函数fputc
  fputc函数的功能是把⼀个字符写⼊指定的⽂件中,函数调⽤的形式为: fputc(字符量,⽂件指针);其中,待写⼊的字符量可以是字符常量或变量,例如:
fputc('a',fp);其意义是把字符a写⼊fp所指向的⽂件中。
  对于fputc函数的使⽤也要说明⼏点:
1. 被写⼊的⽂件可以⽤、写、读写,追加⽅式打开,⽤写或读写⽅式打开⼀个已存在的⽂件时将清除原有的⽂件内容,写⼊字符从⽂件⾸开始。如需保留原有⽂件内容,希望写⼊的字符以⽂件末开始存放,必须以追加⽅式打开⽂件。被写⼊的⽂件若不存在,则创建该⽂件。
2. 每写⼊⼀个字符,⽂件内部位置指针向后移动⼀个字节。
3. fputc函数有⼀个返回值,如写⼊成功则返回写⼊的字符,否则返回⼀个EOF。可⽤此来判断写⼊是否成功。
[例]从键盘输⼊⼀⾏字符,写⼊⼀个⽂件,再把该⽂件内容读出显⽰在屏幕上。
#include<stdio.h>
软考初级含金量main()
{
FILE *fp;
char ch;
if((fp=fopen("string","wt+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("input a string:");
ch=getchar();
while (ch!='')
{
fputc(ch,fp);
ch=getchar();
}
rewind(fp);
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
printf("");
fclose(fp);
}
  程序中第6⾏以读写⽂本⽂件⽅式打开⽂件string。程序第13⾏从键盘读⼊⼀个字符后进⼊循环,当读⼊字符不为回车符时,则把该字符写⼊⽂件之中,然后继续从键盘读⼊下⼀字符。每输⼊⼀个字符,⽂件内部位置指针向后移动⼀个字节。写⼊完毕,该指针已指向⽂件末。如要把⽂件从头读出,须把指针移向⽂件头,程序第19⾏rewind函数⽤于把fp所指⽂件的内部位置指针移到⽂件头。第20⾄25⾏⽤于读出⽂件中的⼀⾏内容。
[例]把命令⾏参数中的前⼀个⽂件名标识的⽂件,复制到后⼀个⽂件名标识的⽂件中,如命令⾏中只有⼀个⽂件名则把该⽂件写到标准输出⽂件(显⽰器)中。#include<stdio.h>
main(int argc,char *argv[])
{
FILE *fp1,*fp2;
char ch;
if(argc==1)
{
printf("have not enter file name strike any key exit");
getch();
exit(0);
}
if((fp1=fopen(argv[1],"rt"))==NULL)
{
printf("Cannot open %s",argv[1]);
getch();
exit(1);
}
if(argc==2)
fp2=stdout;
else if((fp2=fopen(argv[2],"wt+"))==NULL)
{
printf("Cannot open %s",argv[1]);
getch();
exit(1);
}
while((ch=fgetc(fp1))!=EOF)
fputc(ch,fp2);
fclose(fp1);
fclose(fp2);
}
  本程序为带参的main函数。程序中定义了两个⽂件指针 fp1 和fp2,分别指向命令⾏参数中给出的⽂件。如命令⾏参数中没有给出⽂件名,则给出提⽰信息。程序第18⾏表⽰如果只给出⼀个⽂件名,则使fp2指向标准输出⽂件(即显⽰器)。程序第25⾏⾄28⾏⽤循环语句逐个读出⽂件1中的字符再送到⽂件2中。再次运⾏时,给出了⼀个⽂件名(由例10.2所建⽴的⽂件),故输出给标准输出⽂件stdout,即在显⽰器上显⽰⽂件内容。第三次运⾏,给出了⼆个⽂件名,因此把string中的内容读出,写⼊到OK之中。可⽤ DOS命令type显⽰OK的内容。
字符串读写函数fgets和fputs
精通python需要多久⼀、读字符串函数fgets函数的功能是从指定的⽂件中读⼀个字符串到字符数组中,函数调⽤的形式为:fgets(字符数组名,n,⽂件指针);其中的n是⼀个正整数。表⽰从⽂件中读出的字符串不超过 n-1个字符。在读⼊的最后⼀个字符后加上串结束标志' '。例如:fgets(str,n,fp);的意义是从fp所指的⽂件中读出n-1个字符送⼊字符数组str中。
[例]从e10_1.c⽂件中读⼊⼀个含10个字符的字符串。
#include<stdio.h>
main()
{
FILE *fp;嵌入式技术
char str[11];
if((fp=fopen("e10_1.c","rt"))==NULL)
{
kafka延迟消息队列
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
fgets(str,11,fp);
printf("%s",str);
fclose(fp);
}
  本例定义了⼀个字符数组str共11个字节,在以读⽂本⽂件⽅式打开⽂件e101.c后,从中读出10个字符送⼊str数组,在数组最后⼀个单元内将加上' ',然后在屏幕上显⽰输出str数组。输出的⼗个字符正是例10.1程序的前⼗个字符。当前许可不支持影像服务器
  对fgets函数有两点说明:
1. 在读出n-1个字符之前,如遇到了换⾏符或EOF,则读出结束。
2. fgets函数也有返回值,其返回值是字符数组的⾸地址。
⼆、写字符串函数fputs
fputs函数的功能是向指定的⽂件写⼊⼀个字符串,其调⽤形式为: fputs(字符串,⽂件指针) 其中字符串可以是字符串常量,也可以是字符数组名,或指针变量,例如:fputs(“abcd“,fp);其意义是把字符串“abcd”写⼊fp所指的⽂件之中。
[例]在例10.2中建⽴的⽂件string中追加⼀个字符串。
#include<stdio.h>
main()
{
FILE *fp;
char ch,st[20];
if((fp=fopen("string","at+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("input a string:");
scanf("%s",st);
fputs(st,fp);
rewind(fp);
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
printf("");
fclose(fp);
}
  本例要求在string⽂件末加写字符串,因此,在程序第6⾏以追加读写⽂本⽂件的⽅式打开⽂件string 。然后输⼊字符串,并⽤fputs函数把该串写⼊⽂件string。在程序15⾏⽤rewind函数把⽂件内部位置指针移到⽂件⾸。再进⼊循环逐个显⽰当前⽂件中的全部内容。
数据块读写函数fread和rwrite
  C语⾔还提供了⽤于整块数据的读写函数。可⽤来读写⼀组数据,如⼀个数组元素,⼀个结构变量的值等。读数据块函数调⽤的⼀般形式为:
fread(buffer,size,count,fp); 写数据块函数调⽤的⼀般形式为: fwrite(buffer,size,count,fp); 其中buffer是⼀个指针,在fread函数中,它表⽰存放输⼊数据的⾸地址。在fwrite函数中,它表⽰存放输出数据的⾸地址。 size 表⽰数据块的字节数。count 表⽰要读写的数据块块数。fp 表⽰⽂件指针。
例如:
fread(fa,4,5,fp); 其意义是从fp所指的⽂件中,每次读4个字节(⼀个实数)送⼊实数组fa中,连续读5次,即读5个实数到fa中。
[例]从键盘输⼊两个学⽣数据,写⼊⼀个⽂件中,再读出这两个学⽣的数据显⽰在屏幕上。
#include<stdio.h>
struct stu
{
char name[10];
int num;
int age;
char addr[15];
}boya[2],boyb[2],*pp,*qq;
main()
{
FILE *fp;
char ch;
int i;
pp=boya;
qq=boyb;
if((fp=fopen("stu_list","wb+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("input data");
for(i=0;i<2;i++,pp++)
scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
pp=boya;
fwrite(pp,sizeof(struct stu),2,fp);
rewind(fp);
fread(qq,sizeof(struct stu),2,fp);
printf("name number age addr");
for(i=0;i<2;i++,qq++)
printf("%s %5d%7d%s",qq->name,qq->num,qq->age,qq->addr);
fclose(fp);
}
  本例程序定义了⼀个结构stu,说明了两个结构数组boya和 boyb以及两个结构指针变量pp和qq。pp指向boya,qq指向boyb。程序第16⾏以读写⽅式打开⼆进制⽂件“stu_list”,输⼊⼆个学⽣数据之后,写⼊该⽂件中,然后把⽂件内部位置指针移到⽂件⾸,读出两块学⽣数据后,在屏幕上显⽰。
格式化读写函数fscanf和fprintf
fscanf函数,fprintf函数与前⾯使⽤的scanf和printf 函数的功能相似,都是格式化读写函数。两者的区
别在于 fscanf 函数和fprintf函数的读写对象不是键盘和显⽰器,⽽是磁盘⽂件。这两个函数的调⽤格式为: fscanf(⽂件指针,格式字符串,输⼊表列); fprintf(⽂件指针,格式字符串,输出表列);例如:
fscanf(fp,"%d%s",&i,s);
fprintf(fp,"%d%c",j,ch);
[例10.7]
#include<stdio.h>
struct stu
{
char name[10];
int num;
int age;
char addr[15];
}boya[2],boyb[2],*pp,*qq;
main()
{
FILE *fp;
char ch;
int i;
pp=boya;
qq=boyb;
if((fp=fopen("stu_list","wb+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("input data");
for(i=0;i<2;i++,pp++)
scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
pp=boya;
for(i=0;i<2;i++,pp++)
fprintf(fp,"%s %d %d %s",pp->name,pp->num,pp->age,pp->addr);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。