C語言中open與fopen的區別

每次找這個的每一個參數,轉載一份解釋,方便之後查閱。html

轉: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; }
相關文章
相關標籤/搜索