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);
}