Bootstrap

linux下的标准I/O的fopen()与fclose()函数详细介绍及代码演示

标准I/O的fopen()函数

I/O函数介绍

在linux下的I/O操作是一切实现的基础,主要有标准io和系统调用io(文件io)
stido(标准io):移植性好,优先考虑使用,例如printf,fopen
sysio(系统调用io):每个操作系统都有自己的一套系统调用io

一、fopen()介绍

  fopen函数用于打开文件, 其调用格式为:  
FILE *fopen(char *filename, *type);
fopen返回一个文件指针(FILE*),通过该指针可以操作该文件,如关闭文件
filename:为文件名;
type:为打开文件的类型,一共有6种类型
type类型表            文件操作类型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
字符                含义
────────────────────────────
"r"       打开文字文件并定位到第一个字节只读,找不到文件则报错
"r+"      打开一个文字文件并定位到第一个字节读/写,找不到文件则报错
"w"           创建一个文字文件只写,无文件则创建,有文件则清空
"w+"          创建一个文字文件读/写,无文件则创建,有文件则清空
"a"           打开一个文字文件只写, 并定位到结尾
"a+"          打开一个文字文件读写, 并定位到结尾
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
**注意:**
如果fopen失败,返回NULL,同时全局变量errno会赋值为出错原因编号。
errno是一个全局变量,任何语句出现错误都会向erron赋值自己的错误原因编号,
故我们在使用errno是一定要注意出现错误及时打印,防止错误编号被覆盖。
使用全局变量 errno 需要 #include <errno.h>

二、linux的fopen()代码演示

1.例子1

代码如下:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <errno.h>
  4 int main()
  5 {
  6   FILE *pr;
  7   pr=fopen("temp","r");
  8   if(pr==NULL)
  9   {                                                                                                                                                                 
 10     fprintf(stderr,"fopen is fail,erron=%d\n",errno);
 11     exit(1);
 12   }
 13   fprintf(stdout,"ok");
 14   exit(0);
 15 }

该函数实现的功能为:打开一个名为temp的文件。如果fopen失败,返回NULL,同时全局变量errno会赋值为出错原因编号。失败则打印出出错原因编号,成功则返回ok。
开始我们并未创建名为temp的文件 则函数结果为
在这里插入图片描述打开失败失并打印出出错原因编号

然后我们创建名为temp的文件再次运行函数

在这里插入图片描述我们可以看到打印出了ok


例子2

我们打印出错误类型时,只能打印出错误编号,这很不利于我们查看错误,所以我们可以对该例子进行改进,使用perror函数
调用perror()函数不需要传入 errno ,函数内部会自己去获取 errno 变量的值,调用此函数会直接将错误提示字符串打印出来,而不是返回字符串,除此之外还可以在输出的错误提示字符串之前加入自己的打印信息。

#include <stdio.h>
void perror(const char *s);
/*/s:在错误提示字符串信息之前,可加入自己的打印信息,也可不加,不加则传入空字符串即可。
返回值:void 无返回值。*/

改进之后代码为

 1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <errno.h>
  4 int main()
  5 {
  6   FILE *pr;
  7   pr=fopen("temp","r");
  8   if(pr==NULL)
  9 {
 10   perror("fopen()")  ;                                                                                                   
 11   // fprintf(stderr,"fopen is fail,erron=%d\n",errno);
 12     exit(1);             
 13   }                      
 14   fprintf(stdout,"ok");
 15   exit(0);  
 16 }                    

我们删除玩刚刚创建的temp文件之后运行结果如下
在这里插入图片描述此时已经不在显示错误编号而是显示的错误编号所对应的错误原因

三、fclose()介绍

调用 fclose()库函数可以关闭一个由 fopen() 打开的文件。
函数原型如下
#include <stdio.h>
int fclose(FILE *stream);
参数 stream 为 FILE 类型指针,调用成功返回 0 ;
失败将返回 EOF (也就是 -1 ),
并且会设置 errno 来指示错误原因。
我们在打开一个文件在使用完成之后要及时关闭文件,
防止多次打开同一个文件造成资源浪费。
我们调用fclose关闭文件也非常简单,代码如下所示
1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <errno.h>
  4 int main()
  5 {
  6   FILE *pr;
  7   pr=fopen("temp","r");
  8   if(pr==NULL)
  9 {
 10   perror("fopen()")    ;                                                                                                 
 11   // fprintf(stderr,"fopen is fail,erron=%d\n",errno);
 12     exit(1);             
 13   }                      
 14   fprintf(stdout,"ok");
 15	  fclose(pr);
 16   exit(0);  
 17 }                    

总结

提示:这里对文章进行总结:

本次程序很简单,如果仍需运行代码,可在代码区自取

;