【C 语言】文件操作 ( fopen 文件打开方式详解 )「建议收藏」

【C 语言】文件操作 ( fopen 文件打开方式详解 )「建议收藏」r:只读方式打开文件,文件必须存在;文件不存在打开失败;+:读写方式打开文件;w:打开只写文件,文件不存在创建文件,文件存在覆盖文件;a:打开只写文件,文件不存在创建文件,文件存在追加文件;

大家好,又见面了,我是你们的朋友全栈君。

一、fopen 函数


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

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

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;
}

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

文件不存在则打开失败 ;

在这里插入图片描述

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;
}

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

Hello
World

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

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

在这里插入图片描述

4、rb+ 与 r+ 对比

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

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

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

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

其中 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;
}

在这里插入图片描述

文本方式下 , 换行是 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;
}

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

在这里插入图片描述

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

在这里插入图片描述

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;
}

执行结果 : 该程序无论执行多少次 , 显示的结果都是 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;
}

执行结果 :

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

在这里插入图片描述

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

在这里插入图片描述

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;
}

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

在这里插入图片描述

9、a+

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

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

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

三、文件打开方式总结


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

+ : 读写方式打开文件 ;

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158720.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是代理服务器(Proxy)

    什么是代理服务器(Proxy)以类似代理人的身份去取得用户所需要的数据就是了!但是由于它的『代理』能力,使得我们可以透过代理服务器来达成防火墙功能与用户浏览数据的分析! 此外,也可以藉由代理服务器来达成节省带宽的目的,以及加快内部网络对因特网的WWW访问速度  17.1.1什么是代理服务器 我们或许会帮忙家人去办理一些杂务吧!举个例子来说,例如缴费或者是申办提款卡等等的,由于你并不是『

    2022年5月29日
    41
  • Rpc接口测试_Python接口测试

    Rpc接口测试_Python接口测试本发明涉及RPC(RemoteProcedureCallProtocol,远程过程调用协议,通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议)接口测试领域,具体涉及一种RPC接口测试方法及系统。背景技术:接口测试(对系统组件间接口进行测试)主要用于检测外部系统与系统(包括各个子系统)之间的交互点,接口测试重点为检查数据的交换、传递和控制管理过程,以及系统间的相互逻辑依赖关系…

    2022年10月13日
    0
  • C语言中有bool类型吗?

    之前一直都没有注意到,最近在用C语言写DSP算法时,偶然间发现我函数中定义的bool类型的变量在VC6.0(我主要用它来检查一下语法错误)中编译居然报错了,说是bool类型没有定义。用了这么久的C和C

    2021年12月22日
    59
  • 人工智能猴子摘香蕉问题状态过程_人工智能原理猴子吃香蕉问题

    人工智能猴子摘香蕉问题状态过程_人工智能原理猴子吃香蕉问题题目:利用一阶谓词逻辑求解猴子摘香蕉问题:房内有一个猴子,一个箱子,天花板上挂了一串香蕉,其位置如图1所示,猴子为了拿到香蕉,它必须把箱子搬到香蕉下面,然后再爬到箱子上。请定义必要的谓词,列出问题的初始化状态(即下图所示状态),目标状态(猴子拿到了香蕉,站在箱子上,箱子位于位置b)。(附加:从初始状态到目标状态的谓词演算过程。)1.定义描述环境状态的谓词。AT(x,w):x在w处,个体域:x?{monkey},w?{a,b,c,box};HOLD(x,t):x手中拿着t,个体域:t?{box,ba

    2022年9月26日
    0
  • java开发中什么是bd设计,西安交通大学17年9月课程考试《Java语言程序设计》作业考核试题…

    java开发中什么是bd设计,西安交通大学17年9月课程考试《Java语言程序设计》作业考核试题…西安交通大学17年9月课程考试《Java语言程序设计》作业考核试题试卷总分:100得分:0一、单选题(共25道试题,共50分)1.设x为float型变量,y为double型变量,a为int型变量,b为long型变量,c为char型变量,则表达式x+y*a/x+b/y+c的值为()类型。A.intB.longC.doubleD.char满分:2分2.在Java中用什么关键…

    2022年7月8日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号