open是一個非標准的低級文件I/O函數,返回的是文件的低級句柄,原型:
int open(char* path, int access, ……);
open是一個可變參數的函數實現,後面的可變參數通常表示unsigned mode,mode參數是否存在要看access的值,path是文件的路徑。
access和mode的可取值通常在FCNTL.h裡面定義,access的可取值如下:
#define O_RDONLY 1
#define O_WRONLY 2
#define O_RDWR 4
access還可以是以下flag及它們之間的組合而得到的性質:
#define O_CREAT 0x0100 /* create and open file */
#define O_TRUNC 0x0200 /* open with truncation */
#define O_EXCL 0x0400 /* exclusive open */
#define O_APPEND 0x0800 /* to end of file */
#define O_CHANGED 0x1000 /* user may read these bits, but */
#define O_DEVICE 0x2000 /* only RTL\io functions may touch. */
#define O_TEXT 0x4000 /* CR-LF translation */
#define O_BINARY 0x8000 /* no translation */
使用O_CREAT的時候,必須指定mode參數,mode的可取值在sys\stat.h裡面定義,也可以是它們的組合,如下:
#define S_IREAD 0x0100 /* owner may read */
#define S_IWRITE 0x0080 /* owner may write */
open(s[i], 0x0100,0x0080);的意思是以O_CREAT和可寫的方式打開s[i]中指出的文件,如果文件不存在,就創建它。返回這個文件的低級句柄。
函數原型:
int open(const char *path, int access,int mode);
作用:
以各種方式打開文件
返回值:
返回打開的文件句柄,-1 打開失敗
輸入參數說明:
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 可執行
int open(const char *path, int access,int mode);
------------------------------------------------
這個原型是錯誤的,由於第三個參數mode只有當access為O_CREAT的時候才有效,因此open的函數實現是一個可變參數函數,如上那樣聲明的話,就變成了不管access的值是多少,mode都必須給出,這是錯誤的。以下列舉tc2.0、tc3.1、vc6.0、C++Builder和gcc中的open函數的原型:
gcc:
_CRTIMP int __cdecl _open (const char*, int, ……);
VC6.0:
_CRTIMP int __cdecl _open(const char *, int, ……);
Borland C++Builder:
int _RTLENTRY _EXPFUNC open(const char _FAR *__path, int __access,…… /*unsigned mode*/);
tc3.1:
int _Cdecl _FARFUNC open(const char _FAR *__path, int __access,…… /*unsigned mode*/);
tc2.0:
int _Cdecl open (const char *path, int access,…… /*unsigned mode*/);