1. 程式人生 > >系統呼叫方式檔案程式設計

系統呼叫方式檔案程式設計

1.核心理論

檔案描述符:

        在linux系統中,所有開啟的檔案對應一個數字,這個數字由系統來分配,我們稱之為:檔案描述符。

2.函式學習

開啟檔案

函式名:    open

函式原型:int open(const char *pathname, int flags);

                    int open(const char* pathname, int flags, mode_t mode);

函式功能:開啟或建立一個檔案

所屬標頭檔案:<sys/types.h> <sys/stat.h> <fcntl.h>

返回值:成功返回檔案描述符,失敗返回-1

引數說明:

pathname:含路徑的檔名

flags:

許可權:O_RDONLY, O_WRONLY,  O_RDWR

檔案開啟的標誌 

            O_APPEND:以追加方式開啟檔案

            O_CREAT:當開啟的檔案不存在的時候,建立該檔案

mode:一定是在flags中使用了O_CREAT標誌,mode記錄待建立檔案的訪問許可權

建立檔案    

函式名:   creat

函式原型:int creat(const char*pathname, mode_t mode)

函式功能:建立一個檔案,並以只寫的方式開啟該檔案

所屬標頭檔案:<sys/types.h> <sys/stat.h> <fcntl.h>

返回值:成功返回檔案描述符,失敗返回-1

引數:pathname:建立的韓路徑檔名

            mode:建立檔案的讀寫許可權

關閉檔案

函式名:close

函式原型:int close(int fd);

函式功能:關閉一個開啟的檔案

所屬標頭檔案:<unistd.h>

返回值:成功:0 失敗:-1

引數說明:fd 待關閉檔案的檔案描述符

讀檔案

函式名:read

函式原型: ssize_t read(int fd, void *buf, size_t count);

函式功能: 從一個開啟的檔案中讀取資料

所屬標頭檔案:<unistd.h>

返回值: 成功:返回讀取的位元組數 ,失敗:-1

引數說明:fd:檔案描述符, buf:用來儲存讀取的資料,count:希望讀取的位元組數

寫檔案

函式名:write

函式原型:ssize_t write(int fd, void * buf, size_t count);

函式功能:想一個開啟的檔案中寫入資料

標頭檔案:<unistd.h>

返回值:成功:寫入的位元組數, 失敗:-1

引數說明:fd:檔案描述符, buf:要寫入的資料存放位置,count:希望寫入的位元組數

檔案定位

函式名:lseek

函式原型:off_t lseek(int fd, off_t offset, int whence);

函式功能:重新定位檔案的讀寫位置

標頭檔案: <sys/types.h> <unistd.h>

返回值:成功:返回移動後文件指標距離檔案頭的位置, 失敗:-1

引數:fd:檔案描述符, offset:偏移量

  whence:三種取值 SEEK_SET:從檔案頭+偏移量, SEEK_CUR:從當前位置+偏移量, SEEK_END:從檔案尾+偏移量                         

複製檔案描述符

函式名:dup

函式原型:int dup(int oldfd);

函式功能:複製一個檔案描述符

標頭檔案:<unistd.h>

返回值:成功:新檔案描述符, 失敗:-1

引數說明:oldfd 待複製的老的檔案描述符

3.綜合例項

 
  1. /***********************************************

  2. * 程式名:filecp.c

  3. * 功能:檔案複製

  4. **********************************************/

  5.  
  6. #include <sys/types.h>

  7. #include <sys/stat.h>

  8. #include <fcntl.h>

  9. #include <unistd.h>

  10.  
  11. int main(int argc, char *argv[])

  12. {

  13. int fd_s;

  14. int fd_t;

  15. int count = 0;

  16. char buff[512];

  17.  
  18. /*開啟原始檔*/

  19. fd_s = open(argv[1],O_RDONLY);

  20.  
  21. /*開啟目標檔案*/

  22. fd_t = open(argv[2],O_RDWR|O_CREAT,0666);

  23.  
  24. /*讀取原始檔資料*/

  25. while((count = read(fd_s,buff,512)) > 0)

  26. {

  27. /*將讀取出的資料寫入目標檔案*/

  28. write(fd_t,buff,count);

  29. }

  30.  
  31. /*關閉檔案*/

  32. close(fd_s);

  33. close(fd_t);

  34.  
  35. return 0;

  36. }