C语言fopen等几个f函数用法.docx
《C语言fopen等几个f函数用法.docx》由会员分享,可在线阅读,更多相关《C语言fopen等几个f函数用法.docx(17页珍藏版)》请在冰豆网上搜索。
C语言fopen等几个f函数用法
C语言函数fopen
函数简介
函数功能:
打开一个文件
函数原型:
FILE*fopen(constchar*path,constchar*mode);
相关函数:
open,fclose,fopen_s[1],_wfopen
所需库:
返回值:
文件顺利打开后,指向该流的文件指针就会被返回。
若果文件打开失败则返回NULL,并把错误代码存在errno中。
一般而言,打开文件后会作一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。
参数说明:
参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:
r打开只读文件,该文件必须存在。
r+打开可读写的文件,该文件必须存在。
rb+读写打开一个二进制文件,只允许读写数据。
rt+读写打开一个文本文件,允许读和写。
w打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。
若文件不存在则建立该文件。
w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。
若文件不存在则建立该文件。
a以附加的方式打开只写文件。
若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
(EOF符保留)
a+以附加方式打开可读写的文件。
若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
(原来的EOF符不保留)
wb只写打开或新建一个二进制文件;只允许写数据。
wb+读写打开或建立一个二进制文件,允许读和写。
wt+读写打开或着建立一个文本文件;允许读写。
at+读写打开一个文本文件,允许读或在文本末追加数据。
ab+读写打开一个二进制文件,允许读或在文件末追加数据。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。
不过在POSIX系统,包含Linux都会忽略该字符。
由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。
有些C编译系统可能不完全提供所有这些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,读者注意所用系统的规定。
表格1.fopen()中的mode的可能值列表
mode
说明
'r'
只读方式打开,将文件指针指向文件头。
'r+'
读写方式打开,将文件指针指向文件头。
'w'
写入方式打开,将文件指针指向文件头并将文件大小截为零。
如果文件不存在则尝试创建之。
'w+'
读写方式打开,将文件指针指向文件头并将文件大小截为零。
如果文件不存在则尝试创建之。
'a'
写入方式打开,将文件指针指向文件末尾。
如果文件不存在则尝试创建之。
'a+'
读写方式打开,将文件指针指向文件末尾。
如果文件不存在则尝试创建之。
'x'
创建并以写入方式打开,将文件指针指向文件头。
如果文件已存在,则fopen()调用失败并返回FALSE,并生成一条E_WARNING级别的错误信息。
如果文件不存在则尝试创建之。
这和给底层的open
(2)系统调用指定O_EXCL|O_CREAT标记是等价的。
此选项被PHP4.3.2以及以后的版本所支持,仅能用于本地文件。
'x+'
创建并以读写方式打开,将文件指针指向文件头。
如果文件已存在,则fopen()调用失败并返回FALSE,并生成一条E_WARNING级别的错误信息。
如果文件不存在则尝试创建之。
这和给底层的open
(2)系统调用指定O_EXCL|O_CREAT标记是等价的。
此选项被PHP4.3.2以及以后的版本所支持,仅能用于本地文件。
注:
不同的操作系统家族具有不同的行结束习惯。
当你写入一个文本文件并想插入一个新行时,你需要使用符合你操作系统的行结束符号。
基于Unix的系统使用\n作为行结束字符,基于Windows的系统使用\r\n作为行结束字符,基于Macintosh的系统使用\r作为行结束字符。
如果写入文件时使用了错误的行结束符号,则其它应用程序打开这些文件时可能会表现得很怪异。
Windows下提供了一个文本转换标记('t')可以透明地将\n转换为\r\n。
与此对应你还可以使用'b'来强制使用二进制模式,这样就不会转换你的数据。
要使用这些标记,要么用'b'或者用't'作为mode参数的最后一个字符。
默认的转换模式依赖于SAPI和你使用的PHP版本,因此为了便于移植鼓励你总是指定恰当的标记。
当操作以\n作为行结束定界符的纯文本文件时,如果你还期望这些文件可以用于其它应用程序例如Notepad,则应该在脚本中使用't'模式。
在所有其它情况下使用'b'。
在操作二进制文件时如果没有指定'b'标记,可能会碰到一些奇怪的问题,包括坏掉的图片文件以及关于\r\n字符的奇怪问题。
注:
为移植性考虑,强烈建议在用fopen()打开文件时总是使用'b'标记。
注:
再一次,为移植性考虑,强烈建议你重写那些依赖于't'模式的代码使其使用正确的行结束符并改成'b'模式。
如果也需要在include_path中搜寻文件的话,可以将可选的第三个参数use_include_path设为'1'或TRUE。
如果打开失败,本函数返回FALSE。
程序示例
程序示例1
#include
#include//为了使用exit()
intmain()
{
intch;
FILE*fp;
charfname[50];//用于存放文件名
printf("输入文件名:
");
scanf("%s",fname);
fp=fopen(fname,"r");//只供读取
if(fp==NULL)//如果失败了
{
printf("错误!
");
exit
(1);//中止程序
}
//getc()用于在打开文件中获取一个字符
while((ch=getc(fp))!
=EOF)
putchar(ch);
fclose(fp);//关闭文件
return0;
}
注意!
初学者往往会犯一个错误,即在输入文件名时不加后缀名,请注意加上!
程序示例2[2]
#include
FILE*stream,*stream2;
intmain(void)
{
intnumclosed;
//Openforread(willfailiffile"crt_fopen.c"doesnotexist)
if((stream=fopen("crt_fopen.c","r"))==NULL)//C4996
//Note:
fopenisdeprecated;considerusingfopen_sinstead
printf("Thefile'crt_fopen.c'wasnotopened\n");
else
printf("Thefile'crt_fopen.c'wasopened\n");
//Openforwrite
if((stream2=fopen("data2","w+"))==NULL)//C4996
printf("Thefile'data2'wasnotopened\n");
else
printf("Thefile'data2'wasopened\n");
//ClosestreamifitisnotNULL
if(stream)
{
if(fclose(stream))
{
printf("Thefile'crt_fopen.c'wasnotclosed\n");
}
}
//Allotherfilesareclosed:
numclosed=_fcloseall();
printf("Numberoffilesclosedby_fcloseall:
%u\n",numclosed);
}
说明
resourcefopen(stringfilename,stringmode[,booluse_include_path[,resourcezcontext]])
fopen()将filename指定的名字资源绑定到一个流上。
如果filename是"scheme:
//..."的格式,则被当成一个URL,PHP将搜索协议处理器(也被称为封装协议)来处理此模式。
如果该协议尚未注册封装协议,PHP将发出一条消息来帮助检查脚本中潜在的问题并将filename当成一个普通的文件名继续执行下去。
如果PHP认为filename指定的是一个本地文件,将尝试在该文件上打开一个流。
该文件必须是PHP可以访问的,因此需要确认文件访问权限允许该访问。
如果激活了安全模式或者open_basedir则会应用进一步的限制。
2函数名:
fclose
功能:
关闭一个流。
注意:
使用fclose函数就可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区。
用法:
intfclose(FILE*stream);
fread函数和fwrite函数
C,C++编程2009-07-0121:
14:
23阅读1686评论3 字号:
大中小 订阅
source:
1.函数功能
用来读写一个数据块。
2.一般调用形式
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
3.说明
(1)buffer:
是一个指针,对fread来说,它是读入数据的存放地址。
对fwrite来说,是要输出数据的地址。
(2)size:
要读写的字节数;
(3)count:
要进行读写多少个size字节的数据项;
(4)fp:
文件型指针。
注意:
1完成次写操(fwrite())作后必须关闭流(fclose());
2完成一次读操作(fread())后,如果没有关闭流(fclose()),则指针(FILE*fp)自动向后移动前一次读写的长度,不关闭流继续下一次读操作则接着上次的输出继续输出;
3fprintf():
按格式输入到流,其原型是intfprintf(FILE*stream,constchar*format[,argument,...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了。
注意的是返回值为此次操作写入到文件的字节数。
如intc=fprintf(fp,"%s%s%d%f",str1,str2,a,b);str1:
10字节;str2:
10字节;a:
2字节;b:
8字节,c为33,因为写入时不同的数据间自动加入一个空格。
文件使用之后一定要关闭,否则将不能正确显示内容.fwrite:
读入两个学生信息然后用fwrite存入文件
fread:
用fread从文件中读出学生信息。
fwrite.c
#include
#defineSIZE2
structstudent_type
{
charname[10];
intnum;
intage;
charaddr[10];
}stud[SIZE];
voidsave()
{
FILE*fp;
inti;
if((fp=fopen("stu_list","wb"))==NULL)
{
printf("cantopenthefile");
exit(0);
}
for(i=0;i {
if(fwrite(&stud[i],sizeof(structstudent_type),1,fp)!
=1)
printf("filewriteerror\n");
}
fclose(fp);
}
main()
{
inti;
for(i=0;i {
scanf("%s%d%d%s",&stud[i].name,&stud[i].num,&stud[i].age,&stud[i].addr);
save();
}
for(i=0;i {
printf("%s,%d,%d",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
}
}
fread.c
#include
#defineSIZE2
structstudent_type
{
charname[10];
intnum;
intage;
charaddr[10];
}stud[SIZE];
voidread()
{
FILE*fp;
inti;
if((fp=fopen("stu_list","rb"))==NULL)
{
printf("cantopenthefile");
exit(0);
}
for(i=0;i {
if(fread(&stud[i],sizeof(structstudent_type),1,fp)!
=1)
printf("filereaderror\n");
}
fclose(fp);
}
main()
{
inti;
read();
for(i=0;i {
printf("%s,%d,%d,%s",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
printf("\n");
}
}
printf与fprintf函数的区别
printf是标准输出流的输出函数,用来向屏幕这样的标准输出设备输出,而fprintf则是向文件输出,将输出的内容输出到硬盘上的文件或是相当于文件的设备上
printf是有缓冲的输出,fprintf没有缓冲
fprintf()传送输出到一个流中的函数
原形:
intfprintf(FILE*stream,constchar*format[,argument,...])
功能void(0)>:
①向文件指针指向的文件输出ASCⅡ代码
②向显示器输出错误信息void(0)>
使用形式:
①fprintf(文件指针,"输出格式",输出项系列);
②fprintf(stderr,"错误信息");
使用实例:
fprintf(stream,"%d%c%f",i,c,f);
其中定义FILE*stream;
inti; charc; floatf;
返回值:
成功则返回输出的字节数,错误则返回EOF。
头文件:
stdio.h
===================================================
sprintf()格式化输出到数组的函数
原形∶intsprintf(buf,format,arg_list)
其中char*buf;
功能∶把arg_list参量的值按format的格式输出到buf中。
例∶sprintf(buffer,"相对扇区号∶%s(其中∶柱面号为%d/磁头号为%d/扇区号为%d)",string,cyls,head,sector);
其中charbuffer[100];
char*string=" ";
intcyls,head,sector;
返回值∶实际写入数组的字符个数。
头文件∶stdio.h
sprintf是个变参函数,定义如下:
intsprintf(char*buffer,constchar*format[,argument]...);
除了前两个参数类型固定外,后面可以接任意多个参数。
而它的精华,显然就在第二个参数:
格式化字符串上。
printf和sprintf都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的
格式说明符(formatspecifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终
函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。
格式化数字字符串
sprintf最常见的应用之一莫过于把整数打印到字符串中....
格式化读写函数fscanf和fprintf
fscanf函数,fprintf函数与前面使用的scanf和printf函数的功能相似,都是格式化读写函数。
两者的区别在于fscanf函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。
这两个函数的调用格式为:
fscanf(文件指针,格式字符串,输入表列);fprintf(文件指针,格式字符串,输出表列);例如:
fscanf(fp,"%d%s",&i,s);
fprintf(fp,"%d%c",j,ch);
用fscanf和fprintf函数也可以完成以上学生信息的问题。
修改后的程序下所示。
#include
structstu
{
charname[10];
intnum;
intage;
charaddr[15];
}boya[2],boyb[2],*pp,*qq;
main()
{
FILE*fp;
charch;
inti;
pp=boya;
qq=boyb;
if((fp=fopen("stu_list","wb+"))==NULL)
{
printf("Cannotopenfilestrikeanykeyexit!
");
getch();
exit
(1);
}
printf("\ninputdata\n");
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\n",pp->name,pp->num,pp->age,pp->
addr);
rewind(fp);
for(i=0;i<2;i++,qq++)
fscanf(fp,"%s%d%d%s\n",qq->name,&qq->num,&qq->age,qq->addr);
printf("\n\nname\tnumberageaddr\n");
qq=boyb;
for(i=0;i<2;i++,qq++)
printf("%s\t%5d%7d%s\n",qq->name,qq->num,qq->age,
qq->addr);
fclose(fp);
}
Ferror和clearerr
函数名:
ferror
功能:
在调用各种输入输出函数(如putc.getc.fread.fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。
它的一般调用形式为ferroe(fp);如果ferror返回值为0(假),表示未出错。
如果返回一个非零值,表示出错。
应该注意,对同一个文件每一次调用输入输出函数,均产生一个新的ferror函数值,因此,应当在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。
在执行fopen函数时,ferror函数的初始值自动置为0。
用法:
intferror(FILE*stream);
程序例:
#include
intmain(void)
{
FILE*stream;
/*openafileforwriting*/
stream=fopen("DUMMY.FIL","w");
/*forceanerrorconditionbyattemptingtoread*/
(void)getc(stream);
if(ferror(stream))/*testforanerroronthestream*/
{
/*displayanerrormessage*/
printf("ErrorreadingfromDUMMY.FIL\n");
/*resettheerrorandEOFindicators*/
clearerr(stream);
}
fclose(stream);
return0;
}
函数名:
clearerr
功能:
复位错误标志
clearerr函数重置错误标记和给出的流的EOF指针.当发生错误时,你可以使用perror()判断实际上发生了何种错误
用法:
voidclearerr(FILE*stream);
程序例:
#include
intmain(void)
{
FILE*fp;
charch;
/*openafileforwriting*/
fp=fopen("DUMMY.FIL",