C语言fopen等几个f函数用法.docx
- 文档编号:23826282
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:17
- 大小:22.05KB
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
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",
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 fopen 几个 函数 用法
![提示](https://static.bdocx.com/images/bang_tan.gif)