http://blog.csdn.net/Grong_H/archive/2009/12/02/4923332.aspx
linux I/O函數集
----------標頭檔說明------------------
sys/types.h : 常用變數類型
sys/stat.h : 檔案狀態
fcntl.h : 檔案控制
unstd.h : lseek,read,write...
-------------檔案I/O-----------------
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int oflag...,[ mode_t mode ]);
第3個參數寫為...,這是ANSI C說明餘下參數的數目和類型可以變化的方法。
O_RDONLY:唯讀開啟,
O_WRONLY:唯寫開啟,
O_RDWR : 讀、寫開啟.很多實現將O_RDONLY定
O_APPEND:在每次寫時都加到檔案的尾端。
O_CREAT :若此檔案不存在則建立它。使用此可選項時,需同時說明第三個參數mode
O_EXCL :如果同時指定了O_CREAT,而檔案已經存在,則出錯.這使得測試一個檔案是否存在,如果不存在則建立此檔案成為一個原子操作.
O_TRUNC :如果此檔案存在,而且為唯讀或唯寫成功開啟,則將其長度截短為0。
O_NOCTTY:如果pathname指的是終端裝置,則不將此裝置分配作為此進程的控制終端.
O_NONBLOCK:如果pathname指的FIFO、塊特殊或字元特殊檔案,則此項為檔案的開啟和後續的I/O操作設定非阻塞方式。
O_NDELAY(不延遲)標誌較早的系統Ⅴ版本引入了,它與O_NONBLOCK(不阻塞)選擇項類似,
O_SYNC :使每次write都等到物理I/O操作完成。
int create(const char *pathname,mode_t mode);
#include <unistd.h>
int close (int filedes);
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int filedes, off_t offset, int whence);
whence的取值為: SEEK_SET SEEK_CUR SEEK_END
#include <unistd.h>
size_t read(int filedes, void *buff, size_t nbytes);
size_t write(int filedes, const void *buff, size_t nbytes);
#include <unistd.h>
int dup(int filedes);
int dup2(int filedes,int filedes2);
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
int fcntl(int filedes,int cmd,...[int arg]);
#include <unistd.h>
#include <sys/ioctl.h>
int ioctl(int filedes,int request,...);
-------------標準I/O庫---------------
標準I/O庫函數都需要#include <stdio.h>
void setbuf(FILE *fp,char *buf);
int setvbuf(FILE *fp,char *buf,int mode,size_t size);
int fflush(FILE *fp);
FILE *fopen(const char *pathname,const char *type);
FILE *freopen(const char *pathname,const char *type,FILE *fp);
FILE *fdopen(int filedes,const char *type);
int ferror(FILE *fp);
int feof(FILE *fp);
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);
int ungetc(int c , FILE *fp);
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);
char *fgets(char *buf, int n, FILE *fp);
char *gets(char *buf);
int fputs(const char *str,FILE *fp);
int puts(const char *str);
size_t fread(void *ptr,size_t size, size_t nobj,FILE *fp);
size_t fwrite(const void *ptr,size_t size, size_t nobj,FILE *fp);
logn ftell(FILE *fp);
int fseek(FILE *fp, long offset, int whence);
void rewind(FILE *fp);
int fgetpos(FILE *fp, fpos_t *pos);
int fsetpos(FILE *fp, const fpost_t *pos);
int printf(cosnt char *format,...);
int fprintf(FILE *fp, const char *format,...);
int sprintf(char *buf,const char *format,...);
int scanf(const char *format,...);
int fscanf(FILE *fp, const char *format,...);
int sscanf(const char *buf,const char *format,...);
#include <stdarg.h>
int vprintf(const char *format,va_list arg);
int vfprintf(FILE *fp,const char *foramt,va_list arg);
int vspritnf(char *buf,const char *format,va_list arg);
int fileno(FILE *fp);
char *tmpname(char *ptr);
FILE *tmpfile(void);
char *tmpname(const char *directory, const char *prefix);
-------------檔案和目錄--------------
擷取檔案屬性
#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *file_name,struct stat *buf);
int fstat(int filedes,struct stat *buf);
struct stat {
dev_t st_dev; // 裝置
ino_t st_ino; // 節點
mode_t st_mode; // 模式
nlink_t st_nlink; // 硬串連
uid_t st_uid; // 使用者ID
gid_t st_gid; // 組ID
dev_t st_rdev; // 裝置類型
off_t st_off; // 檔案位元組數
unsigned long st_blksize; // 塊大小
unsigned long st_blocks; // 塊數
time_t st_atime; // 最後一次訪問時間
time_t st_mtime; // 最後一次修改時間
time_t st_ctime; // 最後一次改變時間(指屬性)
};
S_ISLNK(st_mode):是否是一個串連.
S_ISREG是否是一個常規檔案.
S_ISDIR是否是一個目錄
S_ISCHR是否是一個字元裝置
S_ISBLK是否是一個塊裝置
S_ISFIFO是否 是一個FIFO檔案.
S_ISSOCK是否是一個SOCKET檔案.
判斷是否具有存取檔案的許可權
#include <unistd.h>
int access(const char *pathname, int mode); //R_OK,W_OK,X_OK,F_OK
改變檔案的許可權
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t cmask);
int chmod(const char *pathname,mode_t mode);
int fchmod(int filedes,mode_t mode);
參數 mode 有下列數種組合
S_ISUID 04000 檔案的(set user-id on execution)位
S_ISGID 02000 檔案的(set group-id on execution)位
S_ISVTX 01000 檔案的sticky位
S_IRUSR(S_IREAD) 00400 檔案所有者具可讀取許可權
S_IWUSR(S_IWRITE)00200 檔案所有者具可寫入許可權
S_IXUSR(S_IEXEC) 00100 檔案所有者具可執行許可權
S_IRGRP 00040 使用者組具可讀取許可權
S_IWGRP 00020 使用者組具可寫入許可權
S_IXGRP 00010 使用者組具可執行許可權
S_IROTH 00004 其他使用者具可讀取許可權
S_IWOTH 00002 其他使用者具可寫入許可權
S_IXOTH 00001 其他使用者具可執行許可權
只有該檔案的所有者或有效使用者識別碼為0,才可以修改該檔案許可權。
改變檔案的所有者
#include <sys/types.h>
#include <unistd.h>
int chown(const char *pathname,uid_t owner, gid_t group);
int fchown(int filedes,uid_t owner,gid_t group);
檔案截短
#include <sys/types.h>
#include <unistd.h>
int truncate(const char *pathname, off_t length);
int ftruncate(int filedes,off_t length);
硬串連
#include <unistd.h>
int link(const char *existingpath, const char *newpath);
int unlink(const char * pathname);
符號串連
#include <unistd.h>
int symlink(const char *actualpath, const char * sympath);
int readlink(const char *pathname,char *buf,int bufsize);
刪除檔案或目錄
#include <stdio.h>
int remove(const char *pathname);
為檔案或目錄更名
#include <stdio.h>
int rename(const char *oldname,const char * newname);
存取和修改時間
#include <sys/types.h>
#include <utime.h>
int utime(const char *pathname,const struct utimbuf *times);
struct utimbuf{
time_t actime; //access time
time_t modtime; //modefication time
}
建立刪除目錄
#include <sys/types.h>
#include <sys/stat.h>
int mkdir(const char *pathname, mode_t mode);
#include <unistd.h>
int rmdir(const char *pathname);
讀目錄
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *pathname);
struct dirent *readdir(DIR *dp);
void rewinddir(DIR *dp);
int closedir(DIR *dp);
struct dirent
{
ino_t d_ino;
ff_t d_off;
signed short int d_reclen;
unsigned char d_type;
har d_name[256];
};
目前的目錄與更改
#include <unistd.h>
int chdir(const char *pathname);
int fchdir(int filedes); //檔案目錄的的描述符.
char *getcwd(char *buf, size_t size);
核心檔案快取重新整理
#include <unistd.h>
void sync(void); //只是將所有修改過的塊的緩衝排入寫隊列,並不等待實際I/O操作.
int fsync(int filedes);//等待到該檔案寫入裝置
-------------進階I/O-----------------
設定非阻塞i/o
open時設定O_NONBLOCK, 或fcntl設定O_NONBLOCK
記錄鎖
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
int fcntl(int filedes,int cmd,struct flock *flockptr);
cmd取值: F_GETLK F_SETLK F_SETLKW
struct flok{
short l_type; //F_RDLCK F_WRLCK F_UNLCK
off_t l_start; //offset in bytes, relative to l_whence
short l_whence; //SEEK_SET, SEEK_CUR ,SEEK_END
off_t l_len; //length ,in bytes , 0 means lock to EOF
pid_t l_pid; //return with F_GETLK
};
I/O多路轉接
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
int select(int maxfdpl, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *tvptr);
struct timeval{
long tv_sec;
long tv_usec;
};
散布讀, 聚集寫
#include <sys/types.h>
#include <sys/uio.h>
size_t readv(int filedes,const struct iovec[],int iovcnt);
size_t writev(int filedes,const struct iovec[],int iovcnt);
struct iovec{
void *iov_base;
size_t iov_len;
};
儲存映射I/O
#include <sys/types.h>
#include <sys/mman.h>
caddr_t mmap(caddr_t addr, size_t len, int prot,int flag,int filedes,off_t off);
prot取值: PROT_READ PROT_WRITE PROT_EXEC PROT_NONE
flag取值: MAP_FIXED MAP_SHARED MAP_PRIVATE
int munmap(caddr_t addr, size_t len);
windows C語言I/O函數集
-------------檔案I/O-----------------
int open(char *pathname,int access,...[,int permiss])
access值見下表
┌────┬────────────────────┐
│access值│意義 │
├────┼────────────────────┤
│O_RDONLY│讀檔案 │
│O_WRONLY│寫檔案 │
│O_RDWR │即讀也寫 │
│O_NDELAY│沒有使用;對UNIX系統相容 │
│O_APPEND│即讀也寫,但每次寫總是在檔案尾添加 │
│O_CREAT │若檔案存在,此標誌無用;若不存在,建新檔案 │
│O_TRUNC │若檔案存在,則長度被截為0,屬性不變 │
│O_EXCL │未用;對UNIX系統相容 │
│O_BINARY│此標誌可顯示地給出以二進位方式開啟檔案 │
│O_TEXT │此標誌可用於顯示地給出以文本方式開啟檔案│
└────┴────────────────────┘
僅當建立新檔案時才使用第三個參數,permiss為檔案屬性,可為以下值:
S_IWRITE允許寫 S_IREAD允許讀 S_IREAD|S_IWRITE允許讀、寫
int creat(char *filename,int permiss)
permiss為檔案讀寫性,可以為以下值
S_IWRITE允許寫 S_IREAD允許讀 S_IREAD|S_IWRITE允許讀、寫
int creatnew(char *filenamt,int attrib)
attrib為檔案屬性,可以為以下值
FA_RDONLY唯讀 FA_HIDDEN隱藏 FA_SYSTEM系統
int creattemp(char *filenamt,int attrib)
attrib為檔案屬性,可以為以下值
FA_RDONLY唯讀 FA_HIDDEN隱藏 FA_SYSTEM系統
int read(int handle,void *buf,int nbyte)
int write(int handle,void *buf,int nbyte)
int dup(int handle)
int dup2(int handle,int newhandle)
int eof(int *handle)
long filelength(int handle)
int setmode(int handle,unsigned mode)
本函數用來設定檔案號為handle的檔案的開啟檔案
int getftime(int handle,struct ftime *ftime)
讀取檔案號為handle的檔案的時間,
並將檔案時間存於ftime結構中,成功返回0,ftime結構如下:
┌─────────────────┐
│struct ftime │
│{ │
│ unsigned ft_tsec:5; //秒 │
│ unsigned ft_min:6; //分 │
│ unsigned ft_hour:5; //時 │
│ unsigned ft_day:5; //日 │
│ unsigned ft_month:4; //月 │
│ unsigned ft_year:1; //年-1980 │
│} │
└─────────────────┘
int setftime(int handle,struct ftime *ftime)
重寫檔案號為handle的檔案時間,
新時間在結構ftime中.成功返回0.結構ftime如下:
┌─────────────────┐
│struct ftime │
│{ │
│ unsigned ft_tsec:5; //秒 │
│ unsigned ft_min:6; //分 │
│ unsigned ft_hour:5; //時 │
│ unsigned ft_day:5; //日 │
│ unsigned ft_month:4; //月 │
│ unsigned ft_year:1; //年-1980 │
│} │
└─────────────────┘
long lseek(int handle,long offset,int fromwhere)
SEEK_SET 檔案開關 SEEK_CUR 當前位置 SEEK_END 檔案尾
long tell(int handle)
int isatty(int handle)
int lock(int handle,long offset,long length) 對檔案分享權限設定作封鎖
int unlock(int handle,long offset,long length) 開啟對檔案分享權限設定的封鎖
int close(int handle)
-------------標準I/O庫---------------
#include<stdio.h>
FILE *fopen(char *filename,char *type) 打
type可為以下字串加上尾碼
┌──┬────┬───────┬────────┐
│type│讀寫性 │文本/2進位檔案│建新/開啟舊檔案 │
├──┼────┼───────┼────────┤
│r │讀 │文本 │開啟舊的檔案 │
│w │寫 │文本 │建新檔案 │
│a │添加 │文本 │有就開啟無則建新│
│r+ │讀/寫 │不限制 │開啟 │
│w+ │讀/寫 │不限制 │建新檔案 │
│a+ │讀/添加 │不限制 │有就開啟無則建新│
└──┴────┴───────┴────────┘
可加的尾碼為t、b。加b表示檔案以二進位形式進行操作,t沒必要使用
FILE *fdopen(int ahndle,char *type)
FILE *freopen(char *filename,char *type,FILE *stream)
int getc(FILE *stream)
int putc(int ch,FILE *stream)
int getw(FILE *stream)
int putw(int w,FILE *stream)
int ungetc(char c,FILE *stream)
int fgetc(FILE *stream)
int fputc(int ch,FILE *stream)
char *fgets(char *string,int n,FILE *stream)
int fputs(char *string,FILE *stream)
int fread(void *ptr,int size,int nitems,FILE *stream) (二進位I/O)
int fwrite(void *ptr,int size,int nitems,FILE *stream) (二進位I/O)
int fscanf(FILE *stream,char *format[,argument,…])
int vfscanf(FILE *stream,char *format,Valist param)
int fprintf(FILE *stream,char *format[,argument,…])
int vfprintf(FILE *stream,char *format,Valist param)
int fseek(FILE *stream,long offset,int fromwhere)
fromwhere可以為以下值:
SEEK_SET 檔案開關 SEEK_CUR 當前位置 SEEK_END 檔案尾
long ftell(FILE *stream)
函數返回定位在stream中的當前檔案指標位置,以位元組表示
int rewind(FILE *stream)
將當前檔案指標stream移到檔案開頭
int feof(FILE *stream)
int fileno(FILE *stream)
取流stream上的檔案處理,並返迴文件處理
int ferror(FILE *stream)
void clearerr(FILE *stream)
void setbuf(FILE *stream,char *buf)
給流stream指定一個緩衝區buf
void setvbuf(FILE *stream,char *buf,int type,unsigned size)
給流stream指定一個緩衝區buf,大小為size,類型為type,type的值見下表
涉及終端裝置是行緩衝,否則是全緩衝.
┌───┬───────────────────────────────┐
│type值│意義 │
├───┼───────────────────────────────┤
│_IOFBF│檔案是完全緩衝區,當緩衝區是空時,下一個輸入操作將企圖填滿整個緩│
│ │沖區.在輸出時,在把任何資料寫到檔案之前,將完全填充緩衝區. │
│_IOLBF│檔案是行緩衝區.當緩衝區為空白時,下一個輸入操作將仍然企圖填整個緩│
│ │沖區.然而在輸出時,每當新行符寫到檔案,緩衝區就被清洗掉. │
│_IONBF│檔案是無緩衝的.buf和size參數是被忽略的.每個輸入操作將直接從文 │
│ │件讀,每個輸出操作將立即把資料寫到檔案中. │
└───┴───────────────────────────────┘
int fclose(FILE *stream) 關閉一個流,可以是檔案或裝置(例如LPT1)
int fcloseall() 關閉所有除stdin或stdout外的流
int fflush(FILE *stream)
int fflushall()
-------------檔案和目錄--------------
int access(char *filename,int amode) 本函數檢查檔案filename並返迴文件的屬性,
函數將屬性存於amode中,amode由以下位的組合構成
06可以讀、寫 04可以讀 02可以寫 01執行(忽略的) 00檔案存在
如果filename是一個目錄,函數將只確定目錄是否存在
函數執行成功返回0,否則返回-1
int chmod(char *filename,int permiss) 本函數用於設定檔案filename的屬性
permiss可以為以下值
S_IWRITE允許寫 S_IREAD允許讀 S_IREAD|S_IWRITE允許讀、寫
char *_fullpath( char *absPath, const char *relPath, size_t maxLength );
char *_mktemp( char *template );
int remove( const char *path );
int rename( const char *oldname,const char *newname );
void _makepath(char *path,const char *drive,const char *dir,const char *fname,const char *ext );
void _splitpath(const char *path,char *drive,char *dir,char *fname,char *ext);
int _stat(const char *path,struct _stat *buffer);
int _umask( int pmode );
int _unlink( const char *filename );
目錄函式,所在函數庫為dir.h、dos.h
int chdir(char *path) 使指定的目錄path(如:"C:\\WPS")變成當前的工作目錄,成功返回0
int findfirst(char *pathname,struct ffblk *ffblk,int attrib)尋找指定的檔案,成功返回0
pathname為指定的目錄名和檔案名稱,如"C:\\WPS\\TXT"
ffblk為指定的儲存檔案資訊的一個結構,定義如下:
┏━━━━━━━━━━━━━━━━━━┓
┃struct ffblk ┃
┃{ ┃
┃ char ff_reserved[21]; //DOS保留字 ┃
┃ char ff_attrib; //檔案屬性 ┃
┃ int ff_ftime; //檔案時間 ┃
┃ int ff_fdate; //檔案日期 ┃
┃ long ff_fsize; //檔案長度 ┃
┃ char ff_name[13]; //檔案名稱 ┃
┃} ┃
┗━━━━━━━━━━━━━━━━━━┛
attrib為檔案屬性,由以下字元代表
┏━━━━━━━━━┳━━━━━━━━┓
┃FA_RDONLY 唯讀檔案┃FA_LABEL 卷標號┃
┃FA_HIDDEN 隱藏檔案┃FA_DIREC 目錄 ┃
┃FA_SYSTEM 系統檔案┃FA_ARCH 檔案 ┃
┗━━━━━━━━━┻━━━━━━━━┛
例:
struct ffblk ff;
findfirst("*.wps",&ff,FA_RDONLY);
int findnext(struct ffblk *ffblk) 取匹配finddirst的檔案,成功返回0
void fumerge(char *path,char *drive,char *dir,char *name,char *ext)
此函數通過盤符drive(C:、A:等),路徑dir(\TC、\BC\LIB等),
檔案名稱name(TC、WPS等),副檔名ext(.EXE、.COM等)組成一個檔案名稱
存與path中.
int fnsplit(char *path,char *drive,char *dir,char *name,char *ext)
此函數將檔案名稱path分解成盤符drive(C:、A:等),路徑dir(\TC、\BC\LIB等),
檔案名稱name(TC、WPS等),副檔名ext(.EXE、.COM等),並分別存入相應的變數中.
int getcurdir(int drive,char *direc) 此函數返回指定磁碟機的當前工作目錄名稱
drive 指定的磁碟機(0=當前,1=A,2=B,3=C等)
direc 儲存指定磁碟機當前工作路徑的變數 成功返回0
char *getcwd(char *buf,iint n) 此函數取當前工作目錄並存入buf中,直到n個位元組長為為止.錯誤返回NULL
int getdisk() 取當前正在使用的磁碟機,返回一個整數(0=A,1=B,2=C等)
int setdisk(int drive) 設定要使用的磁碟機drive(0=A,1=B,2=C等),返回可使用磁碟機總數
int mkdir(char *pathname) 建立一個新的目錄pathname,成功返回0
int rmdir(char *pathname) 刪除一個目錄pathname,成功返回0
char *mktemp(char *template) 構造一個目前的目錄上沒有的檔案名稱並存於template中
char *searchpath(char *pathname) 利用MSDOS找出檔案filename所在路徑,此函數使用DOS的PATH變數,未找到檔案返回NULL