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