linux 系統中,文件IO的流程
文件IO有5個函數:open() read(),write(),close(),leek()。
write()函數編寫,它等同printf()函數,但是引用的更爲直接,它直接寫到內核裏面
是unsitd.h頭文件裏面包含
1、open-打開或者創建一個文件
open(char *, flag, mode)在fcntl.h文件中聲明,函數的作用:創建或這打開文件
參數:最多三個參數
char * 包含有文件名和路徑
flag 打開文件的方式
mode 創建文件的權限
flag | 功能 |
---|---|
O_RDONLY | 只讀 |
– | – |
O_WRONLY | 只寫 |
– | – |
O_RDWR | 讀寫 |
– | – |
O_CREAT | 創建一個文件 |
– | – |
O_EXCL | 檢測文件是否存在 |
– | – |
O_TRUNC | 打開文件覆蓋 |
– | – |
O_APPEND | 打開文件追加 |
編寫一個open()函數,
open(傳入的值,創建一個文件夾 | 具有讀寫權限 , 權限命令爲777)
運行結果爲
創建文件的權限:mode &(~umask)它是權限命令碼和掩碼的與得出的結果
返回值
成功 | 出錯 |
---|---|
文件表述符 文件的ID號 | 返回-1 |
使用追加命令O_APPEND
編譯後 將內容添加到b.c文件中,使用echo命令
echo 添加內容到 > 指定文件
運行文件./append
運行成功
write()函數-寫一個數據到文件
write(int fd, void *buf, size_t count);在fcntl.h庫文件中聲明
參數 | 描述 |
---|---|
int fd | 當前文件的innode輸入,就是寫到哪個文件 |
– | – |
void *buf | 寫的內容buf |
– | – |
sizeof_t | 寫多少個字節sizeof_t |
返回值:實際讀的字節數
例子
這裏向b.c文件寫入一個hello linux 字符串
編譯運行
通過查看可以得到b.c文件裏面的內容
read()函數和write()函數相同
編譯運行結果,在這裏read_buf讀不出數據是因爲在同一個文件中,寫數據的時候指針已經往下移動,沒有重新返回,所以讀取的時候讀到後面的數據,後面的數據爲空
lseek()函數
所以我們這裏引用到leek()函數 -讀取一個文件的位置指針
lseek(int fd, off_t offste,int whence); 在sys/types.h unistd.h庫中聲明
作用:調整讀寫的位置指針
參數 | 描述 |
---|---|
int fd | 當前文件,寫到那個文件 |
– | – |
off_t offset | 偏移量,每讀寫操作所移動的距離,單位是字節的數量,可正負,(正前移負後移) |
– | – |
int whence | 當前位置的基點,有三個標誌: 1、SEEK_SET(文件的開頭)2、SEEK_CUR(文件指針的當前位置)3、SEEK_END(文件的結尾) |
返回值:成功則返回文件指針的當前位置
錯誤則返回-1;
例子:
這裏lseek(哪個文件,從哪裏開始,文件起始命令);
第二位正數是向前移動2位,負爲後移
CP命令函數的實現
這裏把前面介紹的文件 I/O 操作綜合起來,成爲一個完整的文件操作範例。在這個範例 中,先以可寫方式打開當前目錄下的“hello.txt”文件,如果該文件不存在,則創建文件, 再往文件中寫入一個字符串“Hello, welcome to linux world!”,把操作結果輸出到終端後, 關閉文件。接着再次以只讀模式打開該文件,讀取剛纔寫入的數據,並把結果輸出到終端, 最後關閉該文件。
創建 file_wr 目錄,打開文本編輯器,輸入如程序清單 11.8 所示的代碼,命名爲 file_wr.c 並保存到 file_wr 目錄。
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
int main(int argc, char* argv[])
{
char sz_str[] = "Hello, welcome to linux world!";
char sz_filename[] = "hello.txt";
int fd = -1;
int res = 0;
char buf[128] = {0};
fd = open(sz_filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH); /* 以只寫、創建打開文件 權限模式 mode=0x664 */
if(fd < 0)
{
printf("open file \"%s\" failed, errno=%d.\n", sz_filename, errno);
return -1;
}
res = write(fd, sz_str, sizeof(sz_str)); /* 寫文件 */
printf("write %d bytes to \"%s\".\n", res, sz_filename);
fsync(fd); /* 同步文件 */
close(fd); /* 關閉文件 */
fd = open(sz_filename, O_RDONLY); /* 從只讀方式打開文件 */
if(fd < 0)
{
printf("open file \"%s\" failed,errno=%d.\n",sz_filename, errno);
return -1;
}
res = read(fd, buf, sizeof(buf)); /* 讀文件 */
buf[res]='\0'; 36 printf("read %d bytes from file \"%s\", data=\"%s\"\n", res, sz_filename, buf);
close(fd);
return 0;
}
給 file_wr.c 製作一個 Makefile,用 make 命令來編譯。回顧一下 10.2 節關於 Makefile 的內容,把那裏介紹的 Makefile 範例複製到 file_wr 目錄,修改 Makefile 文件前 3 個變量並 保存,改好後的 Makefile 如
進入 file_wr 目錄,輸入 make 命令,完成編譯,運行程序,結果如圖 所示