程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Linux系統下文件的通用操作方法,linux操作方法

Linux系統下文件的通用操作方法,linux操作方法

編輯:關於C語言

Linux系統下文件的通用操作方法,linux操作方法


      每一個系統下都有對文件操作的應用,但是都大致相同,同樣在Linux系統中也同樣擁有對文件的操作。如:文件描述符、open()函數、close()函數、read()函數、write()函數、文件偏移lseek()函數、獲取文件狀態fstat()函數、文件空間映射mmap()函數、取消mmap()映射的munmap()函數、文件屬性fcntl()函數和文件輸入輸出控制ioctl()函數。此處主要說open()函數、close()函數、read()函數、write()函數

      一、文件描述符

     文件描述符是一個整形的數據,所有對文件的操作都通過文件描述符實現。在Linux系統中用文件描述符表示設備文件和普通文件。文件描述符是文件系統中連接用戶空間和內核空間的樞紐。而文件描述符的范圍為0~OPEN_MAX,它是一個有限的資源,在使用完畢後需要及時釋放。

     在Linux系統中有3個已經分配的文件描述符,即標准輸入、標准輸出和標准錯誤,它們的文件描述符的值分別為0、1和2.

     二、打開創建文件open()、create()函數

     open()函數的原型:

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

 

     對於open()函數,在使用時需要包含頭文件sys/types.h、sys/stat.h、fcntl.h。通常在用戶通過open()函數打開pathname指定的文件後,該函數會返回一個值,如果打開成功,返回一個整形的文件描述符。再出錯時會返回-1。對於pathname所指的是一個字符串變量,該字符串變量的長度一般為1024個字節。對於超過這個大小以後,系統會自動截斷,選擇最前面的字節操作。

     對於flags變量是文件標志變量,用於判定文件的打開方式,其中文件的打開方式可以為只讀、只寫或讀寫方式打開,分別用O_RDONLY、O_WRONLY、O_RDWR表示,並且在打開文件的方式時必須使用這三種方式中的其一。在這三個參數中O_RDONLY通常定義為0、O_WRONLY定義為1、O_RDWR定義為2。

     除這上述的三種打開方式外還有其他的一些參數。

        如:O_APPEND:使每次對文件進行寫操作都追加到文件的尾端。

      O_CREAT:如果文件不存在則創建文件

      O_EXCL :查看文件是否存在,如果存在則返回-1

      O_TRUNC:將文件的長度截斷為0.如果此文件存在,並且文件成功打開,則會將其長度截斷為0。

      O_NONBLOCK:以非阻塞方式打開文件,默認的是阻塞方式。

 1 #include<sys/types.h>
 2 #include<sys/stat.h>
 3 #include<fcntl.h>
 4 #include<stdio.h>
 5 int main(void)
 6 {
 7    int fd = -1;
 8    char filename[]="test.txt";
 9    fd = open(filename,O_RDWR);
10    if(fd == -1) 
11       printf("文件打開失敗!,fd:%d\n",fd);
12    else 
13       printf("文件 %s 打開成功!,fd:%d\n",filename,fd);
14 return 0;
15 }

  二、關閉文件close()函數

  close()函數關閉一個打開的文件,之前打開文件所占用的資源。

  close()函數的原型:

1 #include<unistd.h>
2 int close(int fd);

  close()函數關閉的是一個文件描述符,關閉以後此文件描述符不再指向任何文件,從而文件描述符可以再次使用。當函數執行成功時返回0,執行錯誤時返回-1.

  close()函數的例子:

 1 #include<sys/types.h>
 2 #inlcude<sys/stat.h>
 3 #include<fcntl.h>
 4 #include<unistd.h>
 5 #include<stdio.h>
 6 int mian(void)
 7 {
 8    int fd=0;
 9    fd=open("test.txt",O_RDONLY);
10    if(fd >0) 
11       printf("文件打開成功!,fd:%d\n",fd);
12    else 
13    {
14       printf("文件打開失敗!\n");
15       exit(0);  
16    }
17 close(fd);
18 return 0;
19 }

  三、讀取文件read()函數

  read()函數從打開文件中讀取數據,用戶可以對讀入的數據進行操作。

  read()函數的原型:

1 #include<unistd.h>
2 ssize_t read(int fd,void *buf,size_t count);

  read()函數從文件描述符fd對應的文件中讀取count字節,放到buf開始的緩存區中,如果count為0,read()函數返回0;如果count大於SSIZE_MAX,結果不可預料。當read()函數的返回結果為-1時,說明讀取函數有錯誤,在達到文件末尾時,返回0。

  在使用read()函數時,count請求的字節數量,read()函數不一定能夠讀取這麼多數據,在很多中情況下可以使實際上讀取的字節數小於請求讀取的字節數。

     如:

    (1)、讀取普通文件時,文件中剩余的字節數不夠請求的字節數。

    (2)、當從中斷設備數據的時候,其默認長度不夠read()函數請求讀取的字節數。

    (3)、當從網絡讀取數據時,緩存區大小有可能小於讀取請求的數據大小。

  read()函數的例子:

 1 #include<sys/types.h>
 2 #include<sys/stat.h>
 3 #include<fcntl.h>
 4 #include<unistd.h>
 5 #include<stdio.h>
 6 int main(void )
 7 {
 8    int fd = -1,i;
 9    ssize_t size = -1;
10    char buf[10];
11    char filenema[]="test.txt";
12    
13    fd = open(filename,O_RDONLY);
14    if(fd == -1)
15       printf("文件 %s 打開失敗!,fd: %d\n",filename,fd);
16    else
17       printf("文件 %s 打開成功!,fd: %d\n",filename,fd);
18    while(size){
19       size =read(fd,buf,0);
20       if(size == -1)
21       {
22          close(fd);printf("文件讀取失敗!\n");
23       }  else{
24          if(size > 0){
25             printf("read %ld bytes:",size);
26             for(i = 0;i<size;i++) printf("%c",*(buf+i));
27             printf("\n");  
28          }else printf("到達文件末尾\n");
29       }
30    }
31 close(size);
32 return 0;
33 }

  四、寫文件write()函數

  write()函數向打開的文件中寫入數據,將用戶的數據保存到文件中。與read()函數的含義相似,write()函數向文件描述符fd寫入數據,數據的大小由count指定,buf為要寫如數據的指針,write()函數返回值為成功寫入數據的字節數。當文件寫入失敗時,該函數會返回-1。

  write()函數的原型:

1 #include<unistd.h>
2 ssize_t write(int fd,const void *buf,size_t count);

  write()函數例子:

 1 #include<sys/types.h>
 2 #include<sys/stat.h>
 3 #include<fcntl.h>
 4 #include<string.h>
 5 #include<stdio.h>
 6 #include<unistd.h>
 7 int main(void)
 8 {
 9    int fd = -1;
10    ssize_t size = -1;
11    char buf[]="quick brown fox jump over the lazy dog";
12    char filename[]="test.txt";
13 
14    fd = open(filename,O_RDWR);
15    if(-1==fd)
16       printf("文件 %s 打開失敗,fd:%d\n",filename,fd);
17    else 
18       printf("文件 %s 打開成功,fd:%d\n",filename,fd);
19    size = write(fd,buf,strlen(buf));
20    printf("寫入%ld個字節到文件 %s 中\n",size,filename);
21 close(fd);
22 return 0;
23 }

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved