c语言的open,C语言中关于open和fopen的区别

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;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值