【C 语言】文件操作 ( fopen 文件打开方式详解 )

举报
韩曙亮 发表于 2022/01/11 01:00:58 2022/01/11
【摘要】 文章目录 一、fopen 函数二、fopen 函数文件打开方式详解1、r2、r+3、rb+4、rb+ 与 r+ 对比5、rw+6、w7、w+8、a9、a+ 三、文件打开方式总结 ...





一、fopen 函数



fopen 函数用于打开文件 , 函数原型如下 ;

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

  
 
  • 1

const char *filename 参数 : 文件名 ;

const char *mode 参数 : 文件的打开方式 ;





二、fopen 函数文件打开方式详解





1、r


r : 以只读方式打开 , 文件必须存在 ;

  • 如果文件存在 , 则 文件打开成功 ;
  • 如果文件不存在 , 返回的 FILE *p 为 NULL ;

通过判定 FILE* 类型的返回值是否为 NULL , 可以判断文件是否打开成功 , 文件不存在 , 权限不足 , 等都会导致文件打开失败 ;

#include <stdio.h>

int main()
{
    // 以 r 方式打开文件
    FILE *p = fopen("D:\\a.txt", "r");
    if(p == NULL)
    {
        printf("File Open Failed !\n");
    }else
    {
        printf("File Open Success !\n");

        // 如果打开成功 , 则需要关闭文件
        fclose(p);
    }

    printf("Main End\n");
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

文件存在 , 则打开成功 ;
在这里插入图片描述

文件不存在则打开失败 ;

在这里插入图片描述



2、r+


r+ : 以读写方式打开文件 ; 文件必须存在 ;

  • 如果文件存在 , 则 文件打开成功 ;
  • 如果文件不存在 , 返回的 FILE *p 为 NULL ;

类似于 r , 凡是与 r 相关的 , 文件必须存在 ;



3、rb+


rb+ :读写的方式 打开 二进制文件 ; 文件必须存在 ;

  • 如果文件存在 , 则 文件打开成功 ;
  • 如果文件不存在 , 返回的 FILE *p 为 NULL ;

类似于 r , 凡是与 r 相关的 , 文件必须存在 ;


代码示例 :

#include <stdio.h>

int main()
{
    // 以 rb+ 读写方式 打开 二进制文件
    FILE *p = fopen("D:\\a.txt", "rb+");
    if(p == NULL)
    {
        printf("File Open Failed !\n");
    }else
    {
        printf("File Open Success !\n");

        fputs("Hello\n", p);
        fputs("World\n", p);


        // 如果打开成功 , 则需要关闭文件
        fclose(p);
    }

    printf("Main End\n");
    return 0;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

执行结果 : 使用文本查看工具输出

Hello
World

  
 
  • 1
  • 2

使用二进制查看工具 , 输出结果 : 其中 0x0A 指的是 ‘\n’ 字符 ;

48 65 6C 6C 6F 0A 57 6F 72 6C 64 0A

  
 
  • 1

在这里插入图片描述



4、rb+ 与 r+ 对比


在上面使用 " rb+ " 的方式打开文件 , 是以二进制形式打开的文件 , 二进制输出内容为

48 65 6C 6C 6F 0A 57 6F 72 6C 64 0A

  
 
  • 1

下面的代码中 , 使用 " r+ " 的方式打开文件 , 是以文本形式打开的文件 , 二进制输出内容为

48 65 6C 6C 6F 0D 0A 57 6F 72 6C 64 0D 0A

  
 
  • 1

其中 0D 是 ‘\r’ , 0A 是 ‘\n’ , 文本形式中换行被解析为 “\r\n” , 二进制形式只有 ‘\n’ ;


在 Windows 系统下 , 文本都是以 “\r\n” 作为换行符号 ;

在 Linux / Unix 系统下 , 文本都是以 ‘\n’ 作为换行符号 ;


代码示例 :

#include <stdio.h>

int main()
{
    // 以 rb+ 读写方式 打开 二进制文件
    FILE *p = fopen("D:\\a.txt", "r+");
    if(p == NULL)
    {
        printf("File Open Failed !\n");
    }else
    {
        printf("File Open Success !\n");

        fputs("Hello\n", p);
        fputs("World\n", p);


        // 如果打开成功 , 则需要关闭文件
        fclose(p);
    }

    printf("Main End\n");
    return 0;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

在这里插入图片描述

文本方式下 , 换行是 0D 0A , 二进制方式下 , 将数据原封不动输出 ;


在 Windows 下使用文本模式和二进制模式读写数据是不同的 ;

但在 Linux / Unix 下使用文本模式和二进制模式读写文件没有区别 ;



5、rw+


rw+ : 以读写方式打开文本文件 , 允许读写 ;

  • 如果文件存在 , 则 文件打开成功 ;
  • 如果文件不存在 , 返回的 FILE *p 为 NULL ;
  • 写出时 , 将该文件原有数据覆盖 , 即文件长度清 0 0 0 , 删除文件内容 , 重新写入文件内容 ;

代码示例 :

#include <stdio.h>

int main()
{
    // 以 rw+ 读写方式 打开文件
    FILE *p = fopen("D:\\a.txt", "rw+");
    if(p == NULL)
    {
        printf("File Open Failed !\n");
    }else
    {
        printf("File Open Success !\n");

        fputs("Hello\n", p);
        fputs("World\n", p);


        // 如果打开成功 , 则需要关闭文件
        fclose(p);
    }

    printf("Main End\n");
    return 0;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

如果文件存在 , 则文件打开成功 , 写出数据成功 , 写出时覆盖之前的内容 ;

在这里插入图片描述

如果文件不存在 , 则打开失败 ;

在这里插入图片描述



6、w


w : 以写的方式打开文件 ;

  • 如果文件不存在 , 就创建文件 ;
  • 如果文件存在 , 覆盖原有数据重新写入数据 ;
  • 写出时 , 将该文件原有数据覆盖 , 即文件长度清 0 0 0 , 删除文件内容 , 重新写入文件内容 ;
#include <stdio.h>

int main()
{
    // 以 w 方式打开文件
    FILE *p = fopen("D:\\a.txt", "a");
    if(p == NULL)
    {
        printf("File Open Failed !\n");
    }else
    {
        fputs("hello\n", p);

        // 如果打开成功 , 则需要关闭文件
        fclose(p);
    }

    printf("Main End\n");
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

执行结果 : 该程序无论执行多少次 , 显示的结果都是 hello ;

在这里插入图片描述



7、w+


w+ :读写的方式 打开文件 ;

  • 如果文件不存在 , 就创建文件 ;
  • 如果文件存在 , 覆盖原有数据重新写入数据 ;
  • 写出时 , 将该文件原有数据覆盖 , 即文件长度清 0 0 0 , 删除文件内容 , 重新写入文件内容 ;

代码示例 :

#include <stdio.h>

int main()
{
    // 以 w+ 读写方式 打开 二进制文件
    FILE *p = fopen("D:\\a.txt", "w+");
    if(p == NULL)
    {
        printf("File Open Failed !\n");
    }else
    {
        printf("File Open Success !\n");

        fputs("Hello\n", p);
        fputs("World\n", p);

        // 如果打开成功 , 则需要关闭文件
        fclose(p);
    }

    printf("Main End\n");
    return 0;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

执行结果 :

如果文件不存在 , 则直接创建文件 , 并写出数据 ;

在这里插入图片描述

如果文件存在 , 则覆盖原来的文件 , 重新写入数据 ;

在这里插入图片描述



8、a


a :追加方式 打开写文件 ,

  • 如果文件不存在 , 则 创建文件 ;
  • 如果文件存在 , 则新写入的数据会被 追加到文件末尾 , 文件原来的数据会被保留 ;
#include <stdio.h>

int main()
{
    // 以 a 追加方式打开文件
    // 如果文件不存在创建文件
    // 如果文件存在, 则追加数据
    FILE *p = fopen("D:\\a.txt", "a");
    if(p == NULL)
    {
        printf("File Open Failed !\n");
    }else
    {
        // 如果文件不存在创建文件
        // 如果文件存在, 则追加数据
        fputs("hello\n", p);

        // 如果打开成功 , 则需要关闭文件
        fclose(p);
    }

    printf("Main End\n");
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

该程序执行 2 2 2 次之后 , a.txt 文本中变成了两个 hello 文本 , 这是文件追加效果 ;

在这里插入图片描述



9、a+


a+ :追加方式 打开读写文件 ,

  • 如果文件不存在 , 则 创建文件 ;
  • 如果文件存在 , 则新写入的数据会被 追加到文件末尾 , 文件原来的数据会被保留 ;

该操作与 a 操作区别是可读 ;





三、文件打开方式总结



r : 只读方式打开文件 , 文件必须存在 ; 文件不存在打开失败 ;

+ : 读写方式打开文件 ;

w : 打开只写文件 , 文件不存在创建文件 , 文件存在覆盖文件 ;

a : 打开只写文件 , 文件不存在创建文件 , 文件存在追加文件 ;

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/117307116

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。