在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針。通過文件指針就可對它所指的文件進行各種操作。
三水網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、響應式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)2013年至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選創(chuàng)新互聯(lián)。
定義說明文件指針的一般形式為:
FILE *指針變量標識符;
其中FILE應為大寫,它實際上是由系統(tǒng)定義的一個結(jié)構(gòu),該結(jié)構(gòu)中含有文件名、文件狀態(tài)和文件當前位置等信息。在編寫源程序時不必關(guān)心FILE結(jié)構(gòu)的細節(jié)。例如:
FILE *fp;
表示fp是指向FILE結(jié)構(gòu)的指針變量,通過fp即可找存放某個文件信息的結(jié)構(gòu)變量,然后按結(jié)構(gòu)變量提供的信息找到該文件,實施對文件的操作。習慣上也籠統(tǒng)地把fp稱為指向一個文件的指針。
文件在進行讀寫操作之前要先打開,使用完畢要關(guān)閉。所謂打開文件,實際上是建立文件的各種有關(guān)信息,并使文件指針指向該文件,以便進行其它操作。關(guān)閉文件則斷開指針與文件之間的聯(lián)系,也就禁止再對該文件進行操作。
在C語言中,文件操作都是由庫函數(shù)來完成的。在本章內(nèi)將介紹主要的文件操作函數(shù)。
文件的打開(fopen函數(shù))
fopen函數(shù)用來打開一個文件,其調(diào)用的一般形式為:
文件指針名 = fopen( 文件名, 使用文件方式 );
其中:
“文件指針名”必須是被說明為FILE 類型的指針變量;
“文件名”是被打開文件的文件名;
“使用文件方式”是指文件的類型和操作要求;
“文件名”是字符串常量或字符串數(shù)組。
例如:
FILE *fp;
fp=("file a","r");
其意義是在當前目錄下打開文件file a,只允許進行“讀”操作,并使fp指向該文件。又如:
FILE *fphzk;
fphzk=("c:\\hzk16","rb");
其意義是打開C驅(qū)動器磁盤的根目錄下的文件hzk16,這是一個二進制文件,只允許按二進制方式進行讀操作。兩個反斜線“\\ ”中的第一個表示轉(zhuǎn)義字符,第二個表示根目錄。
使用文件的方式共有12種,下面給出了它們的符號和意義。
文件使用方式
意義
rt 只讀打開一個文本文件,只允許讀數(shù)據(jù)
wt 只寫打開或建立一個文本文件,只允許寫數(shù)據(jù)
at 追加打開一個文本文件,并在文件末尾寫數(shù)據(jù)
rb 只讀打開一個二進制文件,只允許讀數(shù)據(jù)
wb 只寫打開或建立一個二進制文件,只允許寫數(shù)據(jù)
ab 追加打開一個二進制文件,并在文件末尾寫數(shù)據(jù)
rt+ 讀寫打開一個文本文件,允許讀和寫
wt+ 讀寫打開或建立一個文本文件,允許讀寫
at+ 讀寫打開一個文本文件,允許讀,或在文件末追加數(shù)據(jù)
rb+ 讀寫打開一個二進制文件,允許讀和寫
wb+ 讀寫打開或建立一個二進制文件,允許讀和寫
ab+ 讀寫打開一個二進制文件,允許讀,或在文件末追加數(shù)據(jù)
對于文件使用方式有以下幾點說明。
1) 文件使用方式由r、w、a、t、b 和 + 六個字符拼成,各字符的含義是:
r(read):讀
w(write):寫
a(append):追加
t(text):文本文件,可省略不寫
b(banary):二進制文件
+:讀和寫
2) 凡用“r”打開一個文件時,該文件必須已經(jīng)存在,且只能從該文件讀出。
3) 用“w”打開的文件只能向該文件寫入。若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經(jīng)存在,則將該文件刪去,重建一個新文件。
4) 若要向一個已存在的文件追加新的信息,只能用“a”方式打開文件。但此時該文件必須是存在的,否則將會出錯。
5) 在打開一個文件時,如果出錯,fopen將返回一個空指針值NULL。在程序中可以用這一信息來判別是否完成打開文件的工作,并作相應的處理。因此常用以下程序段打開文件:
if((fp=fopen("c:\\hzk16","rb")==NULL){
printf("\nerror on open c:\\hzk16 file!");
getch();
exit(1);
}
這段程序的意義是,如果返回的指針為空,表示不能打開C盤根目錄下的hzk16文件,則給出提示信息“error on open c:\ hzk16 file!”,下一行g(shù)etch()的功能是從鍵盤輸入一個字符,但不在屏幕上顯示。在這里,該行的作用是等待,只有當用戶從鍵盤敲任一鍵時,程序才繼續(xù)執(zhí)行,因此用戶可利用這個等待時間閱讀出錯提示。敲鍵后執(zhí)行exit(1)退出程序。
6) 把一個文本文件讀入內(nèi)存時,要將ASCII碼轉(zhuǎn)換成二進制碼,而把文件以文本方式寫入磁盤時,也要把二進制碼轉(zhuǎn)換成ASCII碼,因此文本文件的讀寫要花費較多的轉(zhuǎn)換時間。對二進制文件的讀寫不存在這種轉(zhuǎn)換。
7) 標準輸入文件(鍵盤),標準輸出文件(顯示器),標準出錯輸出(出錯信息)是由系統(tǒng)打開的,可直接使用。
文件關(guān)閉函數(shù)(fclose函數(shù))
文件一旦使用完畢,應用關(guān)閉文件函數(shù)把文件關(guān)閉,以避免文件的數(shù)據(jù)丟失等錯誤。
fclose函數(shù)調(diào)用的一般形式是:
fclose(文件指針);
例如:
fclose(fp);
正常完成關(guān)閉文件操作時,fclose函數(shù)返回值為0。如返回非零值則表示有錯誤發(fā)生。
c語言的fopen函數(shù)編譯鏈接后會將代碼整合到exe文件中
api的函數(shù)編譯鏈接后只是將函數(shù)調(diào)用信息寫入,程序運行時動態(tài)鏈接
應該是這樣
C語言open()函數(shù):打開文件函數(shù)
相關(guān)函數(shù):read, write, fcntl, close, link,stat, umask, unlink, fopen
頭文件:#include sys/types.h #includesys/stat.h #include fcntl.h
定義函數(shù):
intopen(const char * pathname, int flags);
intopen(const char * pathname, int flags, mode_t mode);
函數(shù)說明:
參數(shù) pathname 指向欲打開的文件路徑字符串. 下列是參數(shù)flags 所能使用的旗標:
O_RDONLY 以只讀方式打開文件
O_WRONLY 以只寫方式打開文件
O_RDWR 以可讀寫方式打開文件. 上述三種旗標是互斥的, 也就是不可同時使用, 但可與下列的旗標利用OR(|)運算符組合.
O_CREAT 若欲打開的文件不存在則自動建立該文件.
O_EXCL 如果O_CREAT 也被設置, 此指令會去檢查文件是否存在. 文件若不存在則建立該文件, 否則將導致打開文件錯誤. 此外, 若O_CREAT 與O_EXCL 同時設置, 并且欲打開的文件為符號連接, 則會打開文件失敗.
O_NOCTTY 如果欲打開的文件為終端機設備時, 則不會將該終端機當成進程控制終端機.
O_TRUNC 若文件存在并且以可寫的方式打開時, 此旗標會令文件長度清為0, 而原來存于該文件的資料也會消失.
O_APPEND 當讀寫文件時會從文件尾開始移動, 也就是所寫入的數(shù)據(jù)會以附加的方式加入到文件后面.
O_NONBLOCK 以不可阻斷的方式打開文件, 也就是無論有無數(shù)據(jù)讀取或等待, 都會立即返回進程之中.
O_NDELAY 同O_NONBLOCK.
O_SYNC 以同步的方式打開文件.
O_NOFOLLOW 如果參數(shù)pathname 所指的文件為一符號連接, 則會令打開文件失敗.
O_DIRECTORY 如果參數(shù)pathname 所指的文件并非為一目錄, 則會令打開文件失敗。注:此為Linux2. 2 以后特有的旗標, 以避免一些系統(tǒng)安全問題.
參數(shù)mode 則有下列數(shù)種組合, 只有在建立新文件時才會生效, 此外真正建文件時的權(quán)限會受到umask 值所影響, 因此該文件權(quán)限應該為 (mode-umaks).
S_IRWXU00700權(quán)限, 代表該文件所有者具有可讀、可寫及可執(zhí)行的權(quán)限.
S_IRUSR或S_IREAD, 00400 權(quán)限,代表該文件所有者具有可讀取的權(quán)限.
S_IWUSR或S_IWRITE, 00200 權(quán)限, 代表該文件所有者具有可寫入的權(quán)限.
S_IXUSR或S_IEXEC, 00100 權(quán)限,代表該文件所有者具有可執(zhí)行的權(quán)限.
S_IRWXG00070 權(quán)限, 代表該文件用戶組具有可讀、可寫及可執(zhí)行的權(quán)限.
S_IRGRP00040 權(quán)限, 代表該文件用戶組具有可讀的權(quán)限.
S_IWGRP00020 權(quán)限, 代表該文件用戶組具有可寫入的權(quán)限.
S_IXGRP00010 權(quán)限, 代表該文件用戶組具有可執(zhí)行的權(quán)限.
S_IRWXO00007 權(quán)限, 代表其他用戶具有可讀、可寫及可執(zhí)行的權(quán)限.
S_IROTH00004 權(quán)限, 代表其他用戶具有可讀的權(quán)限
S_IWOTH00002 權(quán)限, 代表其他用戶具有可寫入的權(quán)限.
S_IXOTH00001 權(quán)限, 代表其他用戶具有可執(zhí)行的權(quán)限.
返回值:若所有欲核查的權(quán)限都通過了檢查則返回0 值, 表示成功, 只要有一個權(quán)限被禁止則返回-1.
錯誤代碼:
EEXIST參數(shù)pathname 所指的文件已存在, 卻使用了O_CREAT 和O_EXCL旗標.
EACCESS參數(shù)pathname 所指的文件不符合所要求測試的權(quán)限.
EROFS 欲測試寫入權(quán)限的文件存在于只讀文件系統(tǒng)內(nèi).
EFAULT參數(shù)pathname 指針超出可存取內(nèi)存空間.
EINVAL參數(shù)mode 不正確.
ENAMETOOLONG參數(shù) pathname 太長.
ENOTDIR參數(shù)pathname 不是目錄.
ENOMEM核心內(nèi)存不足.
ELOOP 參數(shù)pathname 有過多符號連接問題.
EIOI/O 存取錯誤.
附加說明:使用access()作用戶認證方面的判斷要特別小心, 例如在access()后再作open()空文件可能會造成系統(tǒng)安全上的問題.
范例
#includeunistd.h
#includesys/types.h
#includesys/stat.h
#includefcntl.h
main()
{
intfd, size;
chars[] = "Linux Programmer!\n", buffer[80];
fd =open("/tmp/temp", O_WRONLY|O_CREAT);
write(fd, s, sizeof(s));
close(fd);
fd =open("/tmp/temp", O_RDONLY);
size= read(fd, buffer, sizeof(buffer));
close(fd);
printf("%s", buffer);
}
執(zhí)行
LinuxProgrammer!
分享題目:c語言文件打開關(guān)閉函數(shù)名 c語言如何打開關(guān)閉文件
當前地址:http://muchs.cn/article4/doshgie.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序、定制網(wǎng)站、關(guān)鍵詞優(yōu)化、云服務器、定制開發(fā)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)