歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 文件操作——利用Linux系統調用(2)

文件操作——利用Linux系統調用(2)

日期:2017/2/25 10:37:02   编辑:Linux教程

文件操作——利用Linux系統調用(2)

3.關閉文件

  int close(int fd)

  fd:文件描述符(一個非負整數)

  4.讀文件

  int read(int fd, const void *buf, size_t length)

  從文件描述符fd所指向的文件中讀取length個字節到buf所指向的緩沖區中,返回實際讀取的字節數。

  5.寫文件

  int write(int fd, const void *buf, size_t length)

  把buf所指向的緩沖區中的length個字節寫到文件描述符fd所指向的文件中,返回實際寫入的字節數。

  6.定位文件(移動文件指針)

  int lseek(int fd, offset_t offset, int whence)

  將文件讀寫指針相對whence移動offset個字節。操作成功,則返回文件指針相對於文件頭的位置。

  whence可以取下述值:

  SEEK_SET:相對文件開頭

  SEEK_CUR:相對文件讀寫指針的當前位置

  SEEK_END:相對文件末尾

  offset可取負值,表示向前移動。

  7.訪問權限判斷

  int access(const char *pathname, int mode)

  pathname:文件名稱

  mode:要判斷的訪問權限,可以取下面的值或者它們的組合。R_OK:文件可讀,W_OK:文件可寫,X_OK:文件可執行,F_OK:文件存在。

  返回值:當我們測試成功時,函數返回0,否則如果有一個條件不符合,返回-1。

  1 #include

  2 #include

  3 #include

  4 #include

  5 #include

  6

  7 #define BUFFER_SIZE 1024

  8

  9 int main(int argc,char **argv)

  10 {

  11 int from_fd,to_fd;

  12 int bytes_read,bytes_write;

  13 char buffer[BUFFER_SIZE];

  14 char *ptr;

  15

  16 if(argc!=3)

  17 {

  18 fprintf(stderr,"Usage:%s fromfile tofile/n/a",argv[0]);

  19 exit(1);

  20 }

  21

  22 /* 打開源文件 */

  23 if((from_fd=open(argv[1],O_RDONLY))==-1)

  24 {

  25 fprintf(stderr,"Open %s Error:%s/n",argv[1],strerror(errno));

  26 exit(1);

  27 }

  28

  29 /* 創建目的文件 */

  30 if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)

  31 {

  32 fprintf(stderr,"Open %s Error:%s/n",argv[2],strerror(errno));

  33 exit(1);

  34 }

  35

  36 /* 以下代碼是一個經典的拷貝文件的代碼 */

  37 while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))

  38 {

  39 /* 一個致命的錯誤發生了 */

  40 if((bytes_read==-1)&&(errno!=EINTR)) break;

  41 else if(bytes_read>0)

  42 {

  43 ptr=buffer;

  44 while(bytes_write=write(to_fd,ptr,bytes_read))

  45 {

  46 /* 一個致命錯誤發生了 */

  47 if((bytes_write==-1)&&(errno!=EINTR))break;

  48 /* 寫完了所有讀的字節 */

  49 else if(bytes_write==bytes_read) break;

  50 /* 只寫了一部分,繼續寫 */

  51 else if(bytes_write>0)

  52 {

  53 ptr+=bytes_write;

  54 bytes_read-=bytes_write;

  55 }

  56 }

  57 /* 寫的時候發生的致命錯誤 */

  58 if(bytes_write==-1)break;

  59 }

  60 }

  61 close(from_fd);

  62 close(to_fd);

  63 exit(0);

  64 }

Copyright © Linux教程網 All Rights Reserved