每次找這個的每個參數,轉載一份解釋,方便以后查閱。
另外fread之類的接口在libc中是有緩沖的,是可配置的,之前遇到過因為使用的newlib配置的是裸機版本,緩沖默認只有1Kbyte,導致fread性能瓶頸
轉:https://account.cnblogs.com/signin?returnUrl=http%3a%2f%2fi.cnblogs.com%2fEditPosts.aspx%3fopt%3d
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;
}