【C语法学习】15 - fopen()函数

1 函数原型

fopen():创建并打开与文件相关联的文件流,函数原型如下:

FILE *fopen(const char *filename, const char *mode);

临时记录

当我们使用fopen()函数打开一个文件时:

  1. 创建一个FILE结构,记录文件的相关信息,返回一个指向FILE结构的指针;
  2. 创建一个流,建立程序和文件之间的数据传输通道。

简单总结:
3. 打开文件就是创建流;
4. 创建的流和打开的文件相关联;
5. 返回的FILE指针标识创建的流;
6. 文件操作函数通过FILE指针操作流来访问文件;FILE指针、流和文件三位一体。

2 返回值

fopen()的返回值类型是一个指向FILE类型的指针,FILE是个结构:

  1. 打开文件成功,则创建一个FILE类型结构的实例,并返回指向该结构实例的指针,程序使用该指针来操作文件;
  2. 打开文件失败,则返回NULL;导致文件打开失败的原因有很多,如:
    (1)使用无效的文件名;
    (2)试图在未准备好的磁盘上打开文件(如磁盘未格式化);
    (3) 文件的目录或盘符不存在;
    (4) 以"r"和"r+"模式打开并不存在的文件。

C语言标准描述如下:

1. On success, returns a pointer to the open file. 
2. On failure, returns a null pointer value .

3 参数

fopen()函数有两个参数:文件名(filename)和模式(mode)。

3.1 文件名

一个文件需要有唯一确定的文件名,以便用户根据文件名找到唯一确定的文件,方便用户对文件的识别和引用。

文件名由三部分组成,文件路径+文件名主干+文件扩展名,如下图所示:

例如:c:\data\list.txt

1. 文件路径:"c:\data\";
2. 文件名:"list";
3. 文件扩展名:".txt";

注意:
4. 使用反斜杠'\'来分隔文件路径中的目录名;
5. C程序中,文件名以字符串的形式存储;
6. C程序中,反斜杠'\'被用作转义字符,标志着转义序列的开始;
7. C程序中,需要用两个反斜杠"\\"来表示文件路径中的目录分隔符'\',如"c:\\data\\list.txt";当从键盘输入文件名时,只需键入一个反斜杠'\';
8. C程序中,路径可省略,此时默认待打开的文件和当前C程序位于同一个目录下;

文件名可以是用双引号引起来的字符串常量或指向字符串的指针。

3.2 模式

模式指定以何种方式打开文件。具体而言,模式控制打开的是文本文件还是二进制文件,是以只读方式打开,只写方式打开。还是读写的方式打开。

以打开文本文件为例,不同打开模式的含义如下图所示:

在这里插入图片描述

当打开二进制文件时,模式为rb、wb、ab、rb+、wb+和ab+,模式的含义都一样。

临时记录

在C语言中,fopen()函数在打开文件时,可以通过mode参数来指定文件的打开模式:

  1. 文本模式打开文件意味着以文本流来处理文件,如"r"、“w”、““a”、”、“r+”、"w+“和"a+”;
  2. 二进制模式打开文件意味着以二进制模式来处理文件,如"rb"、“wb”、““ab”、”、“rb+”、"wb+“和"ab+”。

另外,需要注意的是,文本文件能以二进制流来处理,但二进制文件不能以文本流来处理。

3.2.1 以"r"模式打开

以"r"模式打开文件"1.txt",代码如下图所示:

int main()
{
   FILE* fp = NULL;

   if ((fp = fopen("1.txt", "r")) == NULL)
   {
      printf("Failed to open file in \"r\" mode.\n");
      exit(1);
   }
   else
   {
      printf("Success to open file in \"r\" mode.\n");
      fclose(fp);
   }

   return 0;
}

当文件不存在时,在"r"模式下,打开文件失败,代码运行结果如下图所示:
在这里插入图片描述

当文件存在时,在"r"模式下,打开文件成功,代码运行结果如下图所示:
在这里插入图片描述

3.2.2 以"w"模式打开

以"w"模式打开文件"2.txt",代码如下图所示:

int main()
{
   FILE* fp = NULL;

   if ((fp = fopen("2.txt", "w")) == NULL)
   {
      printf("Failed to open file in \"w\" mode.\n");
      exit(1);
   }
   else
   {
      printf("Success to open file in \"w\" mode.\n");
      for (int i = 0; i < 10; i++)
      {
         fputc('2', fp);
      }
      fclose(fp);
   }

   return 0;
}

当文件不存在时,在"w"模式下,创建新文件,代码运行结果和文件内容如下图所示:
在这里插入图片描述
在这里插入图片描述

当文件存在时,在"w"模式下,清空现有文件,修改代码往文件中写入5个a,代码运行结果和文件内容如下图所示:
在这里插入图片描述
在这里插入图片描述

3.2.3 以"a"模式打开

以"a"模式打开文件"3.txt",代码如下图所示:

int main()
{
   FILE* fp = NULL;

   if ((fp = fopen("3.txt", "a")) == NULL)
   {
      printf("Failed to open file in \"w\" mode.\n");
      exit(1);
   }
   else
   {
      printf("Success to open file in \"w\" mode.\n");
      for (int i = 0; i < 10; i++)
      {
         fputc('3', fp);
      }
      fclose(fp);
   }

   return 0;
}

当文件不存在时,在"a"模式下,创建新文件,代码运行结果和文件内容如下图所示:
在这里插入图片描述
在这里插入图片描述

当文件存在时,在"a"模式下,新数据被附加至现有文件末尾,代码运行结果和文件内容如下图所示:
在这里插入图片描述
在这里插入图片描述

3.2.4 以"r+"模式打开

以"r+“模式打开文件"4.txt”,代码如下图所示:

int main()
{
   FILE* fp = NULL;

   if ((fp = fopen("4.txt", "r+")) == NULL)
   {
      printf("Failed to open file in \"r+\" mode.\n");
      exit(1);
   }
   else
   {
      printf("Success to open file in \"r+\" mode.\n");
      for (int i = 0; i < 10; i++)
      {
         fputc('4', fp);
      }
      fclose(fp);
   }

   return 0;
}

当文件不存在时,在"r+"模式下,打开文件失败,代码运行结果如下图所示:
在这里插入图片描述

当文件存在时,在"r+"模式下,新数据从头开始覆盖现有文件数据,文件初始内容为20个b,代码运行结果和文件内容如下图所示:
在这里插入图片描述
在这里插入图片描述

3.2.5 以"w+"模式打开

以"w+“模式打开文件"5.txt”,代码如下图所示:

int main()
{
   FILE* fp = NULL;

   if ((fp = fopen("5.txt", "w+")) == NULL)
   {
      printf("Failed to open file in \"w+\" mode.\n");
      exit(1);
   }
   else
   {
      printf("Success to open file in \"w+\" mode.\n");
      for (int i = 0; i < 10; i++)
      {
         fputc('5', fp);
      }
      fclose(fp);
   }

   return 0;
}

当文件不存在时,在"w+"模式下,创建新文件,代码运行结果和文件内容如下图所示:
在这里插入图片描述
在这里插入图片描述

当文件存在时,在"w+"模式下,清空现有文件,修改代码往文件中写入5个c,代码运行结果和文件内容如下图所示:
在这里插入图片描述
在这里插入图片描述

3.2.6 以"a+"模式打开

以"a+“模式打开文件"6.txt”,代码如下图所示:

int main()
{
   FILE* fp = NULL;

   if ((fp = fopen("6.txt", "a+")) == NULL)
   {
      printf("Failed to open file in \"a+\" mode.\n");
      exit(1);
   }
   else
   {
      printf("Success to open file in \"a+\" mode.\n");
      for (int i = 0; i < 10; i++)
      {
         fputc('6', fp);
      }
      fclose(fp);
   }

   return 0;
}

当文件不存在时,在"a+"模式下,创建新文件,代码运行结果和文件内容如下图所示:
在这里插入图片描述
在这里插入图片描述

当文件存在时,在"a+"模式下,新数据被附加至现有文件末尾,代码运行结果和文件内容如下图所示:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值