可以做網(wǎng)站的編程有什么軟件成都網(wǎng)絡(luò)推廣優(yōu)化
目錄
一、如何在Linux下做開(kāi)發(fā)
1.vi編輯器
2.gcc編譯工具
3.常用指令
二、文件打開(kāi)及創(chuàng)建?
三、寫(xiě)入文件
四、讀取文件
五、文件“光標(biāo)”位置
一、如何在Linux下做開(kāi)發(fā)
所謂文件編程,就是對(duì)文件進(jìn)行操作,Linux的文件和Windows系統(tǒng)的文件大差不差,只不過(guò)Linux的所有文件都是在同一個(gè)根目錄下,例如/home/book/Linux/file1表示根目錄下的home文件夾里的book文件夾里的Linux文件夾里的file1文件。在此之前,我們先學(xué)習(xí)幾個(gè)常用的指令。
1.vi編輯器
????????vi編輯器是所有Unix及Linux系統(tǒng)下標(biāo)準(zhǔn)的編輯器,它的強(qiáng)大不遜色于任何最新的文本編輯器,這里只是簡(jiǎn)單地介紹一下它的用法和一小部分指令。由于對(duì)Unix及Linux系統(tǒng)的任何版本,vi編輯器是完全相同的,因此您可以在其他任何介紹vi的地方進(jìn)一步了解它。Vi也是Linux中最基本的文本編輯器。
????????在終端輸入“vi”+“文件名” 就可以進(jìn)入文本編輯頁(yè)面,進(jìn)入后默認(rèn)是命令行模式,按“i”進(jìn)入輸入模式,左下角會(huì)提示“--INSERT--”,編輯完后按“esc”返回命令行模式,輸入“:”+“wq”即可保存并退出編輯完的文件。
2.gcc編譯工具
????????GCC(英文全拼:GNU Compiler Collection)是 GNU 工具鏈的主要組成部分,是一套以 GPL 和 LGPL 許可證發(fā)布的程序語(yǔ)言編譯器自由軟件,由 Richard Stallman 于 1985 年開(kāi)始開(kāi)發(fā)。
????????GCC 原名為 GNU C語(yǔ)言編譯器,因?yàn)樗局荒芴幚?C 語(yǔ)言,但如今的 GCC ,不僅可以編譯 C、C++ 和 Objective-C,還可以通過(guò)不同的前端模塊支持各種語(yǔ)言,包括 Java、Fortran、Ada、Pascal、Go 和 D 語(yǔ)言等等。
????????GCC支持多種硬件開(kāi)發(fā)平臺(tái),還能進(jìn)行跨平臺(tái)交叉編譯。此外,GCC是按模塊化設(shè)計(jì)的,可以加入新語(yǔ)言和新CPU架構(gòu)的支持。
看上圖,a.c和a都是用戶(hù)自己取的名字,-o表示直接生成可執(zhí)行文件?,但我在學(xué)習(xí)的過(guò)程中,看到了直接輸入“gcc a.c”的指令,這時(shí)默認(rèn)生成的可執(zhí)行文件的名字為a.out。
3.常用指令
二、文件打開(kāi)及創(chuàng)建?
函數(shù)
/** 使用open函數(shù)必須包含以下頭文件*/
#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);
參數(shù)說(shuō)明
open函數(shù)會(huì)返回一個(gè)非負(fù)的整數(shù),我們稱(chēng)之為"文件描述符",后續(xù)我們對(duì)文件進(jìn)行寫(xiě)入等操作都需要通過(guò)這個(gè)返回值來(lái)操作。?文件打開(kāi)失敗會(huì)返回-1。
- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -
示例:
使用gcc編譯工具編譯.c文件后運(yùn)行,預(yù)期在終端里看到fd的值。(這里open的第一個(gè)參數(shù)可寫(xiě)成./file1,表示當(dāng)前文件夾下的file1文件,但需要注意當(dāng)前所處文件夾下是否有file1文件)?
- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -
如果要打開(kāi)的文件不存在,則需要在open函數(shù)的第二個(gè)參數(shù)“|O_CREAT”,用或操作,并且要輸入第三個(gè)參數(shù),表示創(chuàng)建時(shí)的權(quán)限。
- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -
示例
- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -
“0600”表示創(chuàng)建的file1文件是個(gè)可讀可寫(xiě)的文件,其他權(quán)限我暫時(shí)還不清楚。
?
三、寫(xiě)入文件
函數(shù)
/** 調(diào)用write函數(shù)必須包含以下頭文件*/
#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);
第一個(gè)參數(shù)就是我們之前提到的文件描述符,這個(gè)函數(shù)目的是將指針指向的內(nèi)存里的count字節(jié)的數(shù)據(jù)寫(xiě)入文件描述符為fd的文件里。返回值是你寫(xiě)入的字節(jié)數(shù),出現(xiàn)錯(cuò)誤返回-1。
- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -
示例
?注意write函數(shù)的第三個(gè)參數(shù),計(jì)算字節(jié)長(zhǎng)度時(shí)不能用sizeof,在Linux中,sizeof會(huì)計(jì)算地址的大小,Linux地址長(zhǎng)度為8個(gè)字節(jié)。最后使用close函數(shù)關(guān)閉文件,傳入文件描述符即可。
四、讀取文件
函數(shù)
//使用read函數(shù)需包含以下頭文件
#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);
讀取成功會(huì)返回讀取到的字節(jié)數(shù),失敗返回-1。
- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -?- -?- -?- -?- -?- -?- -?-?- -
示例
使用write函數(shù)時(shí)得到它的返回值,直接定義char *ReadBuf是個(gè)野指針,所以用malloc函數(shù)給ReadBuf分配內(nèi)存,該指針是char型,用sizeof函數(shù)計(jì)算大小,有n_write個(gè),所以*n_write。read函數(shù)也有它的返回值,打印到終端時(shí)預(yù)期打印“read 12,context:Hello World!”。
結(jié)果
發(fā)現(xiàn)讀到了0個(gè)字節(jié),內(nèi)容也是空的,這里就要提到文件光標(biāo)了,我們寫(xiě)入了內(nèi)容后,光標(biāo)是在我們寫(xiě)入內(nèi)容的后面,這時(shí)候去讀文件,自然是從光標(biāo)位置往后讀,所以讀到是空。
解決辦法:?
1.關(guān)閉文件后再打開(kāi),光標(biāo)會(huì)從頭開(kāi)始(最原始的方法)
在寫(xiě)入內(nèi)容后關(guān)閉再打開(kāi)即可。
2.移動(dòng)文件光標(biāo)位置 (見(jiàn)下方)
五、文件“光標(biāo)”位置
函數(shù)
#include <sys/types.h>
#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);
函數(shù)作用:將文件讀寫(xiě)指針相對(duì)whence移動(dòng)offset個(gè)字節(jié),第三個(gè)參數(shù)可以用函數(shù)提供的宏
·SEEK_SET? ? ? ? 光標(biāo)在文件頭部
·SEEK_CUR? ? ? ? 光標(biāo)在當(dāng)前位置
·SEEK_END? ? ? ? 光標(biāo)在文件尾部
offset表示與whence的偏移量,正數(shù)表示向后偏。
拿上面讀取文件的問(wèn)題來(lái)舉例,只需要在讀文件之前,加上這么一行代碼
lseek(fd,0,SEEK_SET);
就能完美解決問(wèn)題。
lseek函數(shù)的另一個(gè)用法:
函數(shù)的返回值是光標(biāo)位置相對(duì)文件頭部的偏移值,所以我們可以用這個(gè)函數(shù)來(lái)計(jì)算文件的大小。
示例:
int filesize = lseek(fd,0,SEEK_END);
補(bǔ)充:
創(chuàng)建文件還可以用creat函數(shù)