每一個系統下都有對文件操作的應用,但是都大致相同,同樣在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 }