频道栏目
首页 > 程序开发 > 软件开发 > C语言 > 正文
C语言中关于open和fopen的区别
2018-05-10 11:33:25      个评论    来源:YLD10的博客  
收藏   我要投稿

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 
#endif
#include 
#include 
#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;
}
点击复制链接 与好友分享!回本站首页
上一篇:C语言如何实现交换两个数?
下一篇:C程序计时方法实现教程
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站