C语言fopen等几个f函数用法.docx

上传人:b****8 文档编号:23826282 上传时间:2023-05-21 格式:DOCX 页数:17 大小:22.05KB
下载 相关 举报
C语言fopen等几个f函数用法.docx_第1页
第1页 / 共17页
C语言fopen等几个f函数用法.docx_第2页
第2页 / 共17页
C语言fopen等几个f函数用法.docx_第3页
第3页 / 共17页
C语言fopen等几个f函数用法.docx_第4页
第4页 / 共17页
C语言fopen等几个f函数用法.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

C语言fopen等几个f函数用法.docx

《C语言fopen等几个f函数用法.docx》由会员分享,可在线阅读,更多相关《C语言fopen等几个f函数用法.docx(17页珍藏版)》请在冰豆网上搜索。

C语言fopen等几个f函数用法.docx

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",

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1