zoukankan      html  css  js  c++  java
  • Linux 下 C语言 open() 和 fopen() 区别

    fopen()

    #include <stdio.h>
    FILE *fopen(const char *path, const char *mode);
    

    mode 指定文件的打开模式:

    • r:只读方式打开一个文本文件(该文件必须存在)
    • r+:可读可写方式打开一个文本文件(该文件必须存在)
    • w:只写方式打开一个文本文件(若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件)
    • w+:可读可写方式创建一个文本文件(若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件)
    • a:追加方式打开一个文本文件(若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留))
    • a+:可读可写追加方式打开一个文本文件(若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留))

    a 和 a+ 的区别:a 不能读,a+ 可以读

    • rb:只读方式打开一个二进制文件(使用法则同r)
    • rb+:可读可写方式打开一个二进制文件(使用法则同r+)
    • wb:只写方式打开一个二进制文件(使用法则同w)
    • wb+:可读可写方式生成一个二进制文件(使用法则同w+)
    • ab:追加方式打开一个二进制文件(使用法则同a)
    • ab+:可读可写方式追加一个二进制文件(使用法则同a+)

    返回值
    fopen() 的返回值是一个 FILE 类型的指针,若打开失败则返回 NULL。

    open()

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    int open(const char *pathname, int flags);
    int open(const char *pathname, int flags, mode_t mode);
    

    flags 用于指定文件的打开/创建模式,这个参数可由以下三个互斥的常量(定义于 fcntl.h)通过逻辑或(|)连接:

    O_RDONLY       只读模式 
    O_WRONLY      只写模式 
    O_RDWR          读写模式
    

    其他可选常量:

    常量 含义
    O_APPEND 每次写操作都写入文件的末尾
    O_CREAT 如果指定文件不存在,则创建这个文件
    O_EXCL 如果要创建的文件已存在,则返回 -1,并且修改 errno 的值
    O_TRUNC 如果文件存在,并且以只写/读写方式打开,则清空文件全部内容
    O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端
    O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)

    以下用于同步输入输出

    常量 含义
    O_DSYNC 等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新
    O_RSYNC read 等待所有写入同一区域的写操作完成后再进行
    O_SYNC 等待物理 I/O 结束后再 write,包括更新文件属性的 I/O

    mode 和 fopen() 函数的 mode 参数相同。

    需要注意的是,当 flags 为 O_CREAT 或 O_TMPFILE 时,必须提供 mode 参数;否则 mode 参数将不起作用。

    返回值
    open() 的返回值是一个 int 类型的文件描述符,打开失败返回 -1。

    区别

    • 前者(open)属于低级IO,后者(fopen)是高级IO。
    • 前者返回一个文件描述符,后者返回一个文件指针。
    • 前者无缓冲,后者有缓冲。
    • 前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
    • 后者是在前者的基础上扩充而来的,在大多数情况下,用后者。
    • fopen() 是 C 标准库中的函数,而 open() 是 Linux 中的系统调用函数。

    参考

    http://man7.org/linux/man-pages/man2/open.2.html
    http://man7.org/linux/man-pages/man3/fopen.3p.html

  • 相关阅读:
    angular的uiRouter服务学习(2)
    angular的uiRouter服务学习(1)
    angular学习笔记(三十一)-$location(2)
    angular指令中使用ngModelController
    angular中的表单数据自定义验证
    angular-ngSanitize模块-linky过滤器详解
    angular-1.3 之ng-model-options指令
    angular控制器的执行顺序和服务的注入情况
    angular五种服务详解
    .NET CORE EF 框架调用存储过程
  • 原文地址:https://www.cnblogs.com/ainsliaea/p/10038997.html
Copyright © 2011-2022 走看看