Linux基礎編程-文件操作open,lseek,read,write,close

From:   http://blog.csdn.net/yao_guet/article/details/6460900

Linux基礎編程-文件操作open,lseek,read,write,close

 

Linux上面對文件的操作可以分爲兩種:1.Linux系統提供的API; 2.C標準的文件操作函數。

前者依賴於Linux系統,後者是標準的C文件操作函數與操作系統無關。

 

文件操作方式主要是打開,讀寫和關閉這三種。

在LinuxAPI之中主要是使用open函數,write,read,close。

open有兩個原形:

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

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

這三個參數比較容易看出它們的含義,pathname是文件路徑,flags打開文件的標誌, mode是打開的模式,返回值應該是打開文件的句柄。

flags標誌有下面的定義:

O_RDONLY 以只讀的方式打開文件

O_WRONLY 以只寫的方式打開文件

O_RDWR 以讀寫的方式打開文件

O_APPEND 以追加的方式打開文件

O_CREAT  創建一個文件

O_EXEC 如果使用了O_CREAT而且文件已經存在,就會發生一個錯誤

O_NOBLOCK 以非阻塞的方式打開一個文件

O_TRUNC  如果文件已經存在,則刪除文件的內容

 

O_RDONLY、O_WRONLY、O_RDWR三個標誌只能使用任意的一個。

 

如果flags中使用了O_CREAT標誌,則調用open函數的時候需要加上打開文件的模式,設置文件的用戶權限

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

下面是mode可取的一些值,下面都是八進制的值,使用這些值的時候需要包含頭文件:sys/types.h,sys/stat.h

S_IRWXU  00700 用戶可以讀

S_IRUSR  00400 用戶可以寫

S_IWUSR  00200 用戶可以執行

S_IXUSR  00100 用戶可以讀、寫、

S_IRWXG  00070 組可以讀

S_IRGRP  00040 組可以寫

S_IWGRP  00020 組可以執行

S_IXGRP  00010 組可以讀寫執行

S_IRWXO  00007 其他人可以讀

S_IROTH  00004 其他人可以寫

S_IWOTH  00002 其他人可以執行

S_IXOTH  00001 其他人可以讀、寫

S_ISUID  04000 設置用戶執行ID

S_ISGID  02000 設置組的執行ID

呵呵,這個跟chmod命令中的後面的值差不多,個人比較喜歡用數值來代替,

用八進制數據表示爲0777等,其中4:讀權限,2:寫權限,1:可執行權限,0:無權限,每一位的值可以取其中的一位或是它們的組合

從最低位開始分別對應的權限是:其它用戶權限,組權限,當前用戶權限。

 

open函數打開一個文件,如果打開成功則返回一個文件描述符,類似於文件句柄吧,這個數值是大於0的,

如果打開文件失敗則會返回-1,這時使用strerror(errno)可以返回錯誤的描述字符串,要使用這個需要包含頭文件errno.h

 

打開文件之後,可以使用lseek函數對文件的讀寫指針位置定位,lseek原型如下:

off_t lseek(int fd, off_t offset, int whence);

fd是打開的文件描述符,offset是與參考偏移的位置,whence是文件參考的位置,它一共有三個位置,

SEEK_SET 文件開始,如果使用此偏移,那麼文件定位到offset的位置

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

SEEK_END 文件結尾

lseek返回值是文件讀寫指針移動之後的位置,-1表示失敗

取得文件當前偏移位置可以如下: f_offset = lseek(fd, 0, SEEK_CUR);

文件大小可以通過下面: f_len = lseek(fd, 0, SEEK_END);

 

使用lseek函數移動好讀寫指針之後,使用read,write即可往文件裏面讀寫數據。

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

ssize_t write(int fd, const void *buf, size_t count);

這兩個函數比較容易看懂的了,從打開的文件,讀取count個字節的數據到buf緩衝區,或是把buf緩衝區的count個字節寫到文件裏面去,

如果沒有錯誤,則會返回實際讀/寫的字節數,如果有錯誤碼,則會返回-1.

記住一種情況,返回的實際讀寫數目可能跟你要讀寫的字節數不一致,這個是沒有錯的,返回0表示讀寫的字節爲0.

 

當我們對文件操作完成之後,需要關閉打開的文件

int close(int fd);

返回0表示關閉成功,-1表示關閉失敗。

 

一個簡單的例子:

    #include <stdio.h>  
    #include <string.h>  
    #include <sys/types.h>  
    #include <sys/stat.h>  
    #include <fcntl.h>  
    #include <errno.h>  
    ///////////////////////////////////////////////////////////  
    int main(int argc, char **argv)  
    {  
        int fd;  
        long fpos;  
        fd = open("open_file_test", O_RDWR | O_CREAT, 0644);  
        if (fd == -1)  
        {  
            printf("open file open_file_test failed!/n%s/n", strerror(errno));  
            return -1;  
        }  
          
        printf("open open_file_test ok!/n");  
        fpos = lseek(fd, 0, SEEK_END);  
        if (fpos == -1)  
        {  
            printf("lseek failed!/n%s/n", strerror(errno));  
            close(fd);  
            return -1;  
        }  
        printf("file size:%ld/n", fpos);  
        close(fd);  
    }  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章