- 回顧標準庫的IO接口
- 學習linux下系統調用IO接口
- 文件描述符的理解
- 重定向的理解
- 文件系統
- 庫文件
1、回顧標準庫的IO接口
fopen / fread / fwrite / fseek / fclose stdin / stdout / stderr
- FILE *fopen(char *filename, char *mode);(文件名稱,打開方式)
打開方式:r-> 只讀,r+ ->讀寫, w->只寫, w+ ->讀寫, a->追加寫(每次寫入數據總是寫入到文件末尾), a+ ->追加讀寫, b->二進制操作。
r+的讀寫與w+讀寫的區別:r+ 讀寫打開文件,若文件不存在則報錯;w+ 讀寫打開文件,若不存在則創建,若存在清空原有內容。
a-> 不僅僅是追加寫,文件不存在還會創建新文件。
b-> 默認清空,如果不指定b,則認爲是文本操作,加上b則認爲是二進制操作;區別在於-> 有時候一個特殊字符,只是一個字符但是佔據兩個字節的內存(讀取一個100字節大小的文件,文本操作最終讀取出來的數據,不一定是100個字節)。
返回值:返回一個FILE*的文件流指針作爲文件的操作句柄;失敗返回NULL.
- size_t fread(char *buf, size_t block_size, size_t block_count, FILE* fp); (緩衝區,塊大小,塊個數,文件流指針)
- size_t fwrite(char *data, size_t block_size, size_t block_count, FILE* fp); (數據首地址,塊大小,塊個數,文件流指針)
note: fread/fwrite 操作的數據實際大小是塊大小*塊個數;塊大小=10,塊個數=2;意味着要寫入/讀取20個字節的數據;
返回值:返回實際操作的塊個數。 例如:讀取一個文件size=10,count=2; 如果文件大小足夠則返回2/但是若文件大小隻有16字節,則會返回1,因爲第二塊沒有讀滿。
fread 如果讀到了文件末尾會返回0;若讀取1000個字節,塊個數爲1,文件大小隻有512字節,雖然讀取了512的數據但是也會返回0.
- int fseek(FILE *fp, long offset, int whence);(將文件的讀寫指針從whence位置偏移offset個字節)--> 跳轉文件讀寫位置
- int fclose(FILE *fp); 關閉文件流指針,釋放資源。
fread/fwrite比較推薦塊大小爲1,塊個數是想要操作的數據長度;
fseek:文件沒有數據也可以跳轉讀寫位置;
對文件數據進行字符串操作的時候要注意文件數據中的\0 這種數據。
標準庫中的IO接口,都是庫函數,而庫函數是對系統調用接口的一層封裝。
2、系統調用接口
open / read / write / lseek / close
- int open(char *filename, int flag, mode_t mode);
filename:要打開的文件名稱
flag:選項參數--文件的打開方式 必選項/可選項
必選項(只能選其一): O_RDONLY-只讀 O_WRONLY-只寫 O_RDWR-讀寫
可選項:O_CREAT - 文件存在則打開,不存在則創建;O_EXCL 與 O_CREAT 同時使用,文件存在則報錯,不存在則創建;O_TRUNC- 打開文件的同時清空原有內容;O_APPEND-追加寫,總是將數據寫入到文件末尾。
mode:權限--如果使用了O_CREAT有可能創建新文件,就一定要指定文件權限(mode & ~umask)---umask(0),八進制數字形式。
返回值:一個非負整數--文件描述符--文件的操作句柄;失敗返回-1;
- ssize_ t write(int fd, char *buf,size_t count);
fd:open 返回的文件描述符--文件操作句柄
buf:要寫入文件的數據的空間首地址
count:要寫入的數據大小
返回值:返回實際寫入文件的數據字節長度;失敗返回-1;
ssize_t read(int fd, char *buf, size_t len);
fd:open返回的文件描述符
buf:從文件中讀取數據放到哪塊緩衝區中的首地址
len:想要讀取的數據長度,注意len不能大於緩衝區的大小
返回值:返回的是實際讀取到的數據字節長度,錯誤返回-1.
off_t lseek(int fd, off_t offset, int whence);
fd:open 返回的文件描述符
offset:偏移量
whence:從哪裏開始偏移 SEEK_SET-文件起始位置 SEEK_CUR-文件當前讀寫位置 SEEK_END-文件末尾
返回值:成功返回當前位置相對於起始位置的偏移量;失敗返回-1;
int close(int fd); 通過文件描述符關閉文件,釋放資源。
3、文件描述符