前言
作者:小蝸牛向前沖
名言:我可以接受失敗,但我不能接受放棄
如果覺的博主的文章還不錯的話,還請
點贊,收藏,關注??支持博主。如果發(fā)現有問題的地方歡迎?大家在評論區(qū)指正。
目錄
一、認識操縱系統(tǒng)下的文件
1、什么是文件
2、文件的類型
3、文件的共識
二、系統(tǒng)級的文件操作接口?
1、文件打開open/文件關閉close
2、其他的文件接口
3、代碼演示文件操作?
本期學習目標:談談對文件的認識,認識操縱系統(tǒng)的文件接口。
一、認識操縱系統(tǒng)下的文件
1、什么是文件
在平常我們對于文件的認識都是在window操縱系統(tǒng)下認識,我們建立的目錄是文件,文本文檔是文件,圖片是文件。
在Linux中有這么一句話:Linux下一切皆文件。
為什么這么說的呢?
Linux中所有的內容都是以文件的形式保存的,我們認為普通文件是文件,一個目錄我們也稱為文件,甚至認為硬件設備(鍵盤,硬盤,打印機等)是文件。
Linux有一個根目錄,其他的所以的文件都放在根目錄中。
2、文件的類型
普通文件
直接就可以使用的我們就稱為普通文件,如上面的makefile就是一個普通文件
目錄文件
這個目錄中包含各個文件的文件名和文件及其指向這些文件的指針,只要有權限就可以訪問目錄中的任何文件,上面的myshell就是一個目錄文件,一個目錄不僅僅有目錄名,還有一些權限設置、文件大小等。
其他的一些文件類型:字符設備文件和塊設文件、套接字文件(socket)、符號鏈接文件(symbolic link)、管道文件(pipe)。
3、文件的共識
- 空文件,也要在磁盤中占據空間。
- 文件 = 內容 +屬性。
- 文件操縱 = 對內容 + 對屬性.
- 如果沒有指明對應的文件的路徑,和默認當前路徑。
- 當我們通過fopen,fclose,fwrite,fread對文件進行操縱的時候,編譯代碼,形成可執(zhí)行的程序,但是不運行,對于的文件操縱執(zhí)行了嗎?沒有(對文件的操縱,本質上是進程對文件的操縱)。
- 一個文件沒有被打開,可以直接進行文件的訪問嗎?不能
通過上面的共識我們可以得出,對文件的操縱的本質?:是進程和打開文件的關系。
二、系統(tǒng)級的文件操作接口?
我們在C語言和C++都有對文件的操縱函數,我們都知道文件是存放在磁盤上的,而要想訪問文件就必須將磁盤上的文件導入到內存中,在進行相應的操作,其實本質上是操作系統(tǒng)在對這些文件進行管理,而C語言和C++中對文件的操作的接口,他底層也是操作系統(tǒng)對文件操作的接口,只是通過了封裝了而已。
1、文件打開open/文件關閉close
文件打開open
?頭文件:<sys/types.h>、?<sys/stat.h>、<fcntl.h>
訪問形式:
1、int open(const char *pathname, int flags);
2、int open(const char *pathname, int flags, mode_t mode);
當我們要調用open接口就必須包含相應的頭文件,但這里要注意的是這里接口為我們提供了二個調用的方式,方式1是文件已經存在我們調用,方式2是文件不存在時要調用的接口。
接口參數:
const char *pathname:這里就指我們要打開的文件名
int flags:指的是標記位,傳過來的比特位,不同的比特位就調用不同選項,從對文件進行一些初始化。
mode_t mode:這里是設置相應的權限(如操作系統(tǒng)默認的普通文件的權限是0x666)
這里我們要重點了解open接口的第二個參數,上面我們說他是一個標記位?,我們知道一個int是有32個比特位了,這里我們用每個比特位表示不同的選項。
下面我們看一段代碼理解一下:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
// 每一個宏,對應的數值,只有一個比特位是1,彼此位置不重疊
#define ONE (1<<0)
#define TWO (1<<1)
#define THREE (1<<2)
#define FOUR (1<<3)
void show(int flags)
{
if(flags & ONE) printf("one\n");
if(flags & TWO) printf("two\n");
if(flags & THREE) printf("three\n");
if(flags & FOUR) printf("four\n");
}
int main()
{
show(ONE);
printf("-----------------------\n");
show(TWO);
printf("-----------------------\n");
show(ONE | TWO);
printf("-----------------------\n");
show(ONE | TWO | THREE);
printf("-----------------------\n");
show(ONE | TWO | THREE | FOUR);
printf("-----------------------\n");
return 0;
}
?
當我們運行代碼,就會發(fā)現我們通過不同的比特位就調用了不同的參數選項,展現出現不同的效果。
flags多個選項:
- O_RDONLY: 只讀打開
- O_WRONLY: 只寫打開
- O_RDWR : 讀,寫打開
- 這三個常量,必須指定一個且只能指定一個
- O_CREAT : 若文件不存在,則創(chuàng)建它。需要使用mode選項,來指明新文件的訪問權
- O_APPEND: 追加寫
- O_TRUNC:如果文件已經存在,且成功打開,則刪除文件中原來的全部數據
對于這些選項我們還可以進行功能的多選,選項間用 “ |?”?分割
O_RDONY | O_CREAT//這里的文件用只讀的方式創(chuàng)建,如果沒有這個文件會自動創(chuàng)建
返回值
- 成功:新打開的文件描述符(fd)
- 失?。?1
文件關閉 close
文件關閉接口用起來非常簡單,只要給他傳打開文件的文件描述符就可以了。?
2、其他的文件接口
read讀文件
函數原型:
ssize_t read(int fd, void *buf, size_t count);
參數?
- fd:是文描述符
- buf:接收讀取數據的緩存區(qū)
- count:讀取的字節(jié)數
- 返回值:讀取成功則返回讀取的字節(jié)數,讀取到文件尾則返回0,讀取失敗則返回-1,同時設置全局變量errno的值來表示錯誤原因;
?write寫文件
函數原型:
ssize_t write(int fd, const void *buf, size_t count);
參數:
- fd:是文描述符
- buf:存放寫入數據的緩存區(qū)
- count:寫入的的字節(jié)數
- 返回值:寫入成功則返回實際寫入的字節(jié)數,寫入失敗則返回-1,同時設置全局變量errno的值來表示錯誤原因;
3、代碼演示文件操作?
下面為了更好的理解文件操作,為了大家演示了文件的打開,寫入和讀取數據,最后在關閉。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
//定義文件名
char filename[] = "pjb.txt";
//定義寫入的數據
char write_data[] = "hellow Linux!";
//讀取的數據
char read_buf[64] = { 0 };
//測試寫入數據
int fd = open(filename, O_RDWR | O_CREAT, O664);
if (fd < 0)
{
perror("open");
return -1;
}
//寫入內容
int ret = write(fd, write_data, sizeof(write_data));
if (ret < 0)
{
perror("write");
return -1;
}
else
{
printf("write: %s\n", write_data);
}
//關閉文件
close(fd);
//測試寫入文件
fd = open(filename, O_RDONLY);;
if (fd < 0)
{
perror("open");
return -1;
}
//寫入
ret = read(fd, read_buf, sizeof(read_buf));
if (ret < 0)
{
perror("read");
return -1;
}
else
{
printf("read: %s\n", read_buf);
}
close(fd);
return 0;
}
文章來源:http://www.zghlxwxcb.cn/news/detail-789389.html
?這里觀察到我們成功向文件中寫入和向文件中讀取數據。文章來源地址http://www.zghlxwxcb.cn/news/detail-789389.html
到了這里,關于[Linux打怪升級之路]-文件操作的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!