? ? ? ? 在linux下操作一個文件,首先要保證文件的存在(不存在就創(chuàng)建),接著打開文件(打開成功)并得到文件描述符,接著在進行讀寫操作,最后還需要關閉文件。如果我們對文件進行讀寫之后不關閉文件,而直接關閉我們的編譯器,可能會造成文件損壞。
? ? ? ? ?文件描述符其實就是我們使用open函數(shù)后一個返回值,我們一般用fd表示。如果你成功的打開文件,open就會返回一個非負值,我們讓fd等于這個非負值;如果你打開文件失敗,open就會返回-1,那么fd就被賦值為-1。
? ? ? ? ?如果說我們的文件夾是一本書,文件是書本的章節(jié),那么文件描述符就相當于我們書本的索引(就是一個目錄,標示了你想要找的東西的位置)。當你想要讀寫文件的內(nèi)容時,你需要利用相應的API函數(shù),而這些API函數(shù)的其中一個參數(shù)就是文件描述符。API函數(shù)通過“文件描述符”這個索引就可以找到文件并對該文件進行操作。
一、Linux常用操作命令
Ctrl Alt t |
開啟命令窗口 |
xrandr |
顯示所有的分辨率 |
xrandr -s 分辨率 |
設置自己想要的分辨率 |
Ctrl l |
清屏 |
Ctrl shift +或者Ctrl + |
放大文字 |
Ctrl - |
縮小文字 |
pwd |
顯示當前文件路徑 |
ls |
顯示當前路徑下有哪些文件(不包含隱藏文件) |
ls -a |
顯示當前路徑下有哪些文件(包含隱藏文件) |
ls -l |
顯示當前路徑下文件的創(chuàng)建時間大小及用戶使用權(quán)限 |
mkdir 文件夾名 |
創(chuàng)建文件夾 |
rm -r 文件夾名 |
刪除文件夾 |
rm 文件名 |
刪除文件 |
cd 文件夾名 |
進入文件夾 |
cd .. |
返回上一級目錄 |
mv *c 新文件夾名 |
把當前目錄下名字以c結(jié)尾的文件或文件夾剪切到新文件夾里 |
mv 文件名1 文件名2 |
把文件1的名字命名為文件2 |
mv 文件夾名1 文件夾名2 |
把文件夾1的名字命名為文件夾2 |
cp 文件1 文件2 |
把文件1的內(nèi)容復制到文件2 |
cp -r 文件夾1 文件夾2 |
把文件夾1的內(nèi)容復制到文件夾2 |
vi 文件名.c |
創(chuàng)建.c文件,進入后默認為命令行模式,按i進入輸入模式;按Esc由輸入模式進入命令模式。接著輸入:wq回車,保存退出。 |
gcc 文件名.c |
編譯該.c文件,默認生成名為a.out的可運行文件 |
./a.out |
運行a.out文件 |
gcc 文件名.c -o 新文件名 |
編譯該.c文件,生成以新文件命名的可運行文件 |
./新文件名 |
運行新文件名的文件 |
vim -r 文件名 |
打開上一次奔潰的文件 |
vimdiff 文件名1 文件名2 |
在同一顯示屏下比較兩個文件,并顯示不同的部分 |
clear |
清屏 |
ps -aux |
查看所有進程 |
cat 已有文件名 |
查看文件內(nèi)容 |
cat > 新文件名 |
創(chuàng)建新文件,可以再文件里寫入內(nèi)容,按ctrl c退出 |
ps -aux|grep 類型名 |
查看這一類型的進程 |
top |
查看任務管理器 |
getpid |
獲取自身進程id號 |
getppid |
獲取父進程id號 |
二、相關API函數(shù)
1.創(chuàng)建/打開文件
①int open(const char *pathname, int flags);
②int open(const char *pathname, int flags, mode_t mode);
③int creat(const char *pathname, mode_t mode);
參數(shù)
Pathname:要打開的文件名字(包含路徑,缺失為當前路徑)
Flags:
必須要有的選項,三選一
O_RDONLY 只讀打開 ??O_WRONLY 只寫打開 ??O_RDWR可讀可寫打開
備用常用選項,可用“|”疊加
O_CREAT:若文件不存在則創(chuàng)建該文件。使用后,要搭配第三個參數(shù)mode,以此來說明該新文件的存取許可權(quán)限。
O_EXCL:如果同時指定了O_CREAT,并且文件已經(jīng)存在則打開文件失敗,返回-1。
O_APPEND:每次書寫都加到文章末尾
O_TRUNC:如果該文件已經(jīng)存在,并且是一個常規(guī)文件,并且訪問模式允許寫入(即,是O_RDWR或O_WRONLY)它將被截斷為長度0。
Mode:在flag中使用了O_CREAT標志后,可以使用該參數(shù)設置待創(chuàng)建文件的訪問權(quán)限
關于mode的參數(shù)補充
每個Linux文件具有四種訪問權(quán)限:可讀(r)、可寫(w)、可執(zhí)行(x)和無權(quán)限(-)。
利用ls -l命令可以看到某個文件或目錄的權(quán)限,它以顯示數(shù)據(jù)的第一個字段為準。第一個字段由10個字符組成,如 -rwxr-xr-x,我們把它劃分為4部分
第1位為第一部分,表示文件類型,-表示文件,d表示目錄
第2-4位為第二部分,表示文件所有者的權(quán)限,u權(quán)限
第5-7位為第三部分,表示文件所有者所屬組成員的權(quán)限,g權(quán)限
第8-10位為第四部分,表示所有者所屬組之外的用戶的權(quán)限,o權(quán)限 ?
2-10位的權(quán)限總和有時稱為a權(quán)限
以上例子中,表示這是一個文件(非目錄),文件所有者具有讀、寫和執(zhí)行的權(quán)限,所有者所屬組成員和所屬組之外的用戶具有讀和執(zhí)行的權(quán)限而沒有寫的權(quán)限。
如果我們使用int open(const char *pathname, int flags, mode_t mode)函數(shù),參數(shù)mode是數(shù)字,那我們?nèi)绾斡脭?shù)字表示第二第三第四部分的權(quán)限呢?
所謂數(shù)字表示法,是指將r、w和x分別用4、2、1來代表,沒有授予權(quán)限的(即-)則為0,
比如我們剛剛舉得例子rwxr-xr-x,它的2到10位一共三個部分的權(quán)限,我們劃分來看。
第二部分是rwx,對應數(shù)字是421,加起來就是7;第三部分是r-x,對應數(shù)字是401,加起來就是5;第四部分是rwx,對應數(shù)字是401,加起來就是5。所以如果mode用數(shù)字表示就是755,具體的例子,下面的程序再說。
如果打開成功,返回新的文件描述符(一個非負整數(shù)),如果發(fā)生錯誤,一般返回-1。
①與②API函數(shù)的區(qū)別在有無mode,而需不需要mode這個參數(shù),就要看第二個參數(shù)里是否包含O_CREAT。如果有O_CREAT,就要包含mode這個參數(shù);如果沒有,就不用包含這個參數(shù)。因為如果包含O_CREAT同時文件沒有,那么文件就需要被創(chuàng)建,被創(chuàng)建的同時還需要規(guī)定文件的訪問權(quán)限,這就需要mode的參與。
③這個API函數(shù)可以直接去輸入你想要的文件名,以及權(quán)限,就可以實現(xiàn)文件的創(chuàng)建了
2.寫入文件
④ssize_t write(int fd, const void *buf, size_t count);
參數(shù):
fd:文件打開后對應的文件描述符
buf:寫入內(nèi)容緩沖區(qū)
count:寫入文件的大小
如果寫入成功,則返回寫入的字節(jié)數(shù)。如果出現(xiàn)錯誤,則返回-1,并設置errno以指示錯誤的原因。
3.讀文件
⑤ssize_t read(int fd, void *buf, size_t count);
參數(shù):
fd:文件打開后對應的文件描述符
buf:讀內(nèi)容緩沖區(qū)
count:讀入文件的大小
如果寫入成功,則返回讀的字節(jié)數(shù)。如果出現(xiàn)錯誤,則返回-1,并設置errno以指示錯誤的原因。
4.文件光標移動
⑥off_t lseek(int fd, off_t offset, int whence);
參數(shù):
fd:文件打開后對應的文件描述符
offset:相對于whence偏移的位置。0,不偏移;正整數(shù),向右偏移對應的大小;負整數(shù),向左偏移對應的大小。
whence:光標起始位置,一共有三個選項,如下
SEET_SET???????? 文件開頭
SEET_CUR???????? 文件當前位置
SEET_END???????? 文件尾部
如果成功,則返回相對于文件頭的偏移量。如果出現(xiàn)錯誤,則返回-1。如果我們設置為
lseek(fd,0,SEET_END)就可以利用他的返回值來表示文件的大小了。
5.關閉文件
⑦int close(int fd);
參數(shù)
fd:文件打開后對應的文件描述符
關閉成功返回零。如果出現(xiàn)錯誤,則返回-1,并適當?shù)卦O置errno。
三、API函數(shù)的功能驗證
1.文件創(chuàng)建的驗證
?? 在當前目錄下,我們是沒有file1文件的,這時候我們建立demo1.c,使用int open(const char *pathname, int flags)無法打開file1。如下圖
當前文件下無file1
demo1.c的代碼
執(zhí)行完demo1.c,文件描述符fd的返回值是-1,說明打開文件失敗
建立demo2.c使用int open(const char *pathname, int flags, mode_t mode),先進行判斷,如果沒有file1,顯示失敗時的文件描述符,接著建立file1后在顯示正確的文件描述符;如果有file1,直接顯示正確的文件描述符。
demo2.c代碼,
執(zhí)行完demo2.c后的情況,可以看到file1從無到有,通過O_CREAT實現(xiàn)了file1的創(chuàng)建,最后的文件描述符為正值。
當前路徑下輸入ls -l可以查看當前路徑下所有文件的權(quán)限以及狀態(tài)。在demo2.c里我們將open函數(shù)的第三個參數(shù)mode設置為0600,可以看到對應的file1是對應的權(quán)限是
-rw-------,結(jié)合我們上文講的數(shù)字表示文件權(quán)限就可以知道0600就代表者第二部分擁有可讀可寫的權(quán)限
2.文件寫入驗證
首先我們刪除file1,在demo3.c里使用write函數(shù),寫入yangdong is handsome
demo3.c的代碼如下
執(zhí)行完demo3.c后結(jié)果如下圖所示
打開file1后可以看到文件顯示的內(nèi)容
3.文件讀取的驗證
在demo3.c的基礎上修該代碼,首先我們要通過文件描述符的值驗證file1中是否寫成功入了內(nèi)容。當成功寫入后,我們要調(diào)用lseek()函數(shù)把文件光標置前,不然我們讀取內(nèi)容的時候是從文件的末尾讀取的,但是你可以想象,既然文件光標都到文章末尾了,都沒東西了,那你還讀啥?讀空氣啊。所以當你往文章里寫好東西之后,如果你想要讀,記得把文件光標置前。
我們依舊先刪除file1,在demo4.c里使用write,lseek,read函數(shù),寫入yangdong is handsome
demo4.c的代碼如下
執(zhí)行完demo4.c后的現(xiàn)象,我們可以看到寫入多少,讀出多少;寫入什么,讀出什么。
4.open函數(shù)打開文件中參數(shù)flag中可搭配選項的驗證
O_EXCL功能的驗證
file1此時已存在,我們可以看到demo5.c的open函數(shù)中同時加入了O_CREAT和O_EXCL,這時候文件打開失敗,文件描述符被賦值為-1。
demo5.c的代碼
demo5.c的運行結(jié)果
O_APPEND的驗證
現(xiàn)在file1里面的內(nèi)容是yangdong is handsome,如果想在文件中繼續(xù)寫入123456。但是我們在open函數(shù)里不加參數(shù)O_APPEND和加O_APPEND有啥區(qū)別呢,下面我們來看一下。
open函數(shù)里不加O_APPEND
原文件內(nèi)容如下
代碼如下
運行完之后file1的內(nèi)容如下
我們可以看到,不過open函數(shù)里不加O_APPEND,那么我們寫入文件的內(nèi)容就會寫入多少,覆蓋原文件多少。
現(xiàn)在在現(xiàn)有file1的基礎上驗證open函數(shù)里加O_APPEND的情況
原文件內(nèi)容如下
代碼如下
運行結(jié)果如下,我們可以看到open函數(shù)里加O_APPEND后,寫入的內(nèi)容是從文件末尾新加進去,并沒有覆蓋原文件內(nèi)容
驗證O_TRUNC:
現(xiàn)在file1的內(nèi)容如下
當我們在open函數(shù)中加入?yún)?shù)O_TRUNC以后,我們往文件中寫入內(nèi)容,原文件的內(nèi)容會被全部刪除,只顯示我們新寫入的東西。
代碼如下
文章來源:http://www.zghlxwxcb.cn/news/detail-799486.html
運行后file1中的內(nèi)容如下,可以看到原來的內(nèi)容已經(jīng)被替換成了abcdefg文章來源地址http://www.zghlxwxcb.cn/news/detail-799486.html
到了這里,關于Linux下文件的創(chuàng)建寫入讀取編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!