Linux下系统函数open,read,write,lseek函数
一、簡介
1. open
- 頭文件
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>
-
定義函數:
int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode); -
函數說明:
第一個參數pathname 指向欲打開的文件路徑字符串。
第二參數flags 所能使用的旗標:
1.O_RDONLY 只讀打開。
2.O_WRONLY 只寫打開。
3.O_RDWR 讀、寫打開。
4.O_APPEND 每次寫時都加到文件的尾端。
5.O_CREAT 若此文件不存在則創建它。使用此選擇項時,需同時說明第
第三個參數mode,用其說明該新文件的存取許可權位。
參數mode 則有下列數種組合, 只有在建立新文件時才會生效, 此外真正建文件時的權限會受到umask 值所影響, 因此該文件權限應該為 (mode-umaks).
S_IRWXU00700 權限, 代表該文件所有者具有可讀、可寫及可執行的權限.
S_IRUSR 或S_IREAD, 00400 權限, 代表該文件所有者具有可讀取的權限.
S_IWUSR 或S_IWRITE, 00200 權限, 代表該文件所有者具有可寫入的權限.
S_IXUSR 或S_IEXEC, 00100 權限, 代表該文件所有者具有可執行的權限.
S_IRWXG 00070 權限, 代表該文件用戶組具有可讀、可寫及可執行的權限.
2.Read
- 定義函數
ssize_t read(int fd, void * buf, size_t count);
- 使用的頭文件:
#include <unistd.h>
- 函數的參數說明
【int fd】這個是文件指針
【void *buf】讀上來的數據保存在緩沖區buf中,同時文件的當前讀寫位置向后移
【size_t count】是請求讀取的字節數。若參數count 為0, 則read()不會有作用并返回0. 返回值為實際讀取到的字節數, 如果返回0
3.Write
- 定義函數
ssize_t write (int fd, const void * buf, size_t count);
- 函數說明
write()會把參數buf 所指的內存寫入count 個字節到參數fd 所指的文件內. 當然, 文件讀寫位置也會隨之移動.
4.sleek
-
定義函數
off_t lseek(int fildes,off_t offset,int whence) -
函數說明
每個已打開的文件都有一個讀寫位置,當打開文件通常的讀寫位置是指向文件的開頭,若是以追加的方式打開(調用open 函數時使用了O_APPEND),則讀寫位置會指向文件末尾,當調用read()或creat()時,讀寫的位置隨之增加;參數fildes為已打開的文件描述符,參數offset為根據參數whence來移動的讀寫位置的偏移量.文件指針的值等于當前指針的值加上offset的值。 -
1.SEEK_SET
-從文件開始處計算偏移量,文件指針到文件開始處的偏移量為offset. -
2.SEEK_CUR
-從文件的指針的當前位置開始計算偏移量,文件指針值等于當前指針值加上offset的值,offset允許為負數. -
3.SEEK_END
-從文件的結尾處計算偏移量,文件指針值等于當前指針的值加上offset的值.offset 允許取負數
二、實現文件的復制
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h>int main(int argc, const char* argv[]) {int fd01 = open("english.txt", O_RDWR);//可讀可寫printf("fd01=%d\n", fd01);if (fd01 == -1){perror("Open failed");//錯誤代碼寫入errno,perror根據errno的數值顯示相對應的錯誤}//打開另一個文件,若沒有則建立int fd02 = open("test04", O_WRONLY | O_CREAT, 0777);printf("fd02=%d\n", fd02);//read讀4Kchar buf[1024 * 2];//緩沖區int len = read(fd01, buf, sizeof(buf));//sizeof包含\0while (len > 0)//==0就是讀完{int fd03 = write(fd02, buf, len);//寫printf("fd03=%d", fd03);//文件指針再移動4k,繼續讀len = read(fd01, buf, sizeof(buf));}close(fd01);close(fd02);return 0; } gcc system_func.c -o system_func ./system_func vim test04結果顯示:
三、文件的拓展(lseek)
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h>int main(int argc, const char* argv[]) {int fd = open("english.txt", O_RDWR);if (fd == -1){perror("open error!");}//文件指針移到最后,再偏移1000int len = lseek(fd, 1000, SEEK_END);write(fd, "a", 1);//必須寫入才生效close(fd);return 0; } ll english.txt gcc lseekTest.c -o lseekTest ./lseekTest ll english.txt結果顯示:
說明:
系統顯示全是亂碼,其實全部是"\0",占位的作用。
- 如下載一個10G電影,剛開始就會在磁盤上先分配10G內存,先占位,怕后面別人占用。
- 下載是多線程的,如1號指針負責前部分,2號指針負責后部分,占位后2號指針才能找到,才能移動過。
總結
以上是生活随笔為你收集整理的Linux下系统函数open,read,write,lseek函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回调函数案列(C高级)
- 下一篇: matlab读取txt数据绘图(pyth