C语言学习中关于open和fopen的区别
小标 2018-07-25 来源 : 阅读 1047 评论 0

摘要:本文主要向大家介绍了C语言学习中关于open和fopen的区别,通过具体的内容向大家展示,希望对大家学习C语言有所帮助。

本文主要向大家介绍了C语言学习中关于open和fopen的区别,通过具体的内容向大家展示,希望对大家学习C语言有所帮助。

int open(const char *path, int access,int mode)

path 要打开的文件路径和名称

access 访问模式,宏定义和含义如下:

O_RDONLY 1 只读打开

O_WRONLY 2 只写打开

O_RDWR 4 读写打开

还可选择以下模式与以上3种基本模式相与:

O_CREAT 0x0100 创建一个文件并打开

O_TRUNC 0x0200 打开一个已存在的文件并将文件长度设置为0,其他属性保持

O_EXCL 0x0400 未使用

O_APPEND 0x0800 追加打开文件

O_TEXT 0x4000 打开文本文件翻译CR-LF控制字符

O_BINARY 0x8000 打开二进制字符,不作CR-LF翻译

mode 该参数仅在access=O_CREAT方式下使用,其取值如下:

S_IFMT 0xF000 文件类型掩码

S_IFDIR 0x4000 目录

S_IFIFO 0x1000 FIFO 专用

S_IFCHR 0x2000 字符专用

S_IFBLK 0x3000 块专用

S_IFREG 0x8000 只为0x0000

S_IREAD 0x0100 可读

S_IWRITE 0x0080 可写

S_IEXEC 0x0040 可执行

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

filename 文件名称

mode 打开模式:

r 只读方式打开一个文本文件

rb 只读方式打开一个二进制文件

w 只写方式打开一个文本文件

wb 只写方式打开一个二进制文件

a 追加方式打开一个文本文件

ab 追加方式打开一个二进制文件

r+ 可读可写方式打开一个文本文件

rb+ 可读可写方式打开一个二进制文件

w+ 可读可写方式创建一个文本文件

wb+ 可读可写方式生成一个二进制文件

a+ 可读可写追加方式打开一个文本文件

ab+ 可读可写方式追加一个二进制文件

open和fopen的区别:

前者属于低级IO,后者是高级IO。

前者返回一个文件描述符,后者返回一个文件指针。

前者无缓冲,后者有缓冲。

前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。

后者是在前者的基础上扩充而来的,在大多数情况下,用后者。

fopen的一个实现

#if defined(_POSIX_SOURCE)

#include <sys types.h="">

#endif

#include <stdio.h>

#include <stdlib.h>

#include "loc_incl.h"

 

#define PMODE    0666

#define O_RDONLY 0

#define O_WRONLY 1

#define O_RDWR   2

#define O_CREAT  0x010

#define O_TRUNC  0x020

#define O_APPEND 0x040

 

int _open(const char *path, int flags);

int _creat(const char *path, Mode_t mode);

int _close(int d);

 

FILE * fopen(const char *name, const char *mode)

{

    register int i;

    int rwmode = 0, rwflags = 0;

    FILE *stream;

    int fd, flags = 0;

 

    for (i = 0; __iotab[i] != 0 ; i++)

            if ( i >= FOPEN_MAX-1 )

                    return (FILE *)NULL;

 

    switch(*mode++) {

    case 'r':

            flags |= _IOREAD | _IOREADING;       

            rwmode = O_RDONLY;

            break;

    case 'w':

            flags |= _IOWRITE | _IOWRITING;

            rwmode = O_WRONLY;

            rwflags = O_CREAT | O_TRUNC;

            break;

    case 'a':

            flags |= _IOWRITE | _IOWRITING | _IOAPPEND;

            rwmode = O_WRONLY;

            rwflags |= O_APPEND | O_CREAT;

            break;        

    default:

            return (FILE *)NULL;

    }

 

    while (*mode) {

            switch(*mode++) {

            case 'b':

                    continue;

            case '+':

                    rwmode = O_RDWR;

                    flags |= _IOREAD | _IOWRITE;

                    continue;

 

            default:

                    break;

            }

            break;

    }

 

    if ((rwflags & O_TRUNC)

        || (((fd = _open(name, rwmode)) < 0)

                && (rwflags & O_CREAT))) {

            if (((fd = _creat(name, PMODE)) > 0) && flags  | _IOREAD) {

                    (void) _close(fd);

                    fd = _open(name, rwmode);

            }

 

    }

 

    if (fd < 0) return (FILE *)NULL;

 

    if (( stream = (FILE *) malloc(sizeof(FILE))) == NULL ) {

            _close(fd);

            return (FILE *)NULL;

    }

 

    if ((flags & (_IOREAD | _IOWRITE))  == (_IOREAD | _IOWRITE))

            flags &= ~(_IOREADING | _IOWRITING);

    stream->_count = 0;

    stream->_fd = fd;

    stream->_flags = flags;

    stream->_buf = NULL;

    __iotab[i] = stream;

    return stream;

}</stdlib.h></stdio.h></sys>

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程