轉:https://account.cnblogs.com/signin?returnUrl=http%3a%2f%2fi.cnblogs.com%2fEditPosts.aspx%3fopt%3d1post
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; }