linux的檔案操作

來源:互聯網
上載者:User

S_ISREG()  正規檔案
S_ISDIR()  目錄檔案
S_ISCHR()  字元裝置檔案
S_BLK()   塊裝置檔案
S_FIFO   有名管道檔案
S_ISLNK   符號連結檔案
S_SOCK   通訊端檔案

#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname,int oflag,.../*,modet mode */);
 正確返回:檔案描述符
 錯誤返回:-1
pathname是待開啟或待建立的語言件名
 * O_RDONLY  唯讀方式開啟
 * O_WRONLY  唯寫方式開啟
 * O_RDWR  讀寫方式開啟
注意,為了和UNIX以前的程式相容大我數情況下,O_RDONLY的值為0 O_WRONLY的值為1,O_RDWR的值為2
 此外還可以包含利用按位邏輯加符號對下列標誌值進行任意組合
O_APPEND 每次寫檔案時從檔案的末尾開始
O_CREAT  如果檔案不存在,則建立檔案,如果使用這個參數,則必須在後面跟第三個參數——mode,設定對新文的訪問方式
O_EXCL  如果檔案存在,但又設定了參數O_CREATE會產生錯誤,這個參數可以檢查檔案是否存在,以及檔案不存在時建立此檔案的情況
O_TRUNC  如果檔案存在,而且檔案以唯寫或讀寫方式正確的開啟,則將檔案長度截至為0、

S_IRUSR  檔案所有者的讀許可權位
S_IWUSR  檔案所有者的寫入權限位
S_IXUSR  檔案所有者的執行許可權位
S_IRGRP  檔案使用者組的讀許可權位
S_IWGRP  檔案使用者組的寫入權限位
S_IXGRP  檔案使用者組的執行許可權位
S_IROTH  檔案其它使用者的讀許可權位
S_IWOTH  檔案其它使用者的寫入權限位
S_IXOTH  檔案其它使用者的執行許可權位

三個有用的按位邏緝加組合定義如下
S_IRWXU 定義為(S_IRUSR|S_IWUSR|S_IXUSR)
S_IRWXG 定義為(S_IRGRP|S_IWGRP|S_IXGRP)
S_IRWXO 定義為(S_IROTH|S_IWOTH|S_IXOTH)

此外還可以利用下列的常量值設定set_uid位和set_gid位
S_ISUID  置set_uid位
S_ISGID  置set_gid位

當一個進程代表你建立文時,其許可權位由該進程相聯絡的umask值所修改,進程利用下列公式決定被建立的檔案實際許可權位:
 mode&(~umask)
 這表示程式所建立的檔案上得到的許可權位可能和在open()調用中所要求的mode參數不一致,如果安全問題很重要,我們可以umask的值做一些事情

 

 有時試圖開啟一個特定的檔案之前,可能希望檢驗進程是否已經訪問過該檔案這時可以有access系統調用來完成。access系統調用的一般形式是:
 #include <unistd.h>
 int access(char *pathname,int mode);
 正確返回:1
 錯語返回:0
 其中,pathname是希望檢驗的檔案名稱mode是包函在unistd.h中的下列值之一
 R_OK 檢驗調用進程是否有過讀寫訪問
 W_OK 檢驗調用進程是否有過寫訪問
 X_OK 檢驗調用進程是否有過執行訪問
 F_OK 檢驗規定檔案是否存在

 /**
 * 建立一個新檔案 5.2.2.c
 */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int creat(const char *pathname,mode_t mode)
這個函數等價於:
 open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode)

 /**
  * 隨機檔案操作
  */
 #include <sys/stypes.h>
 #include <unistd.h>
 off_t lseek(int fd,off_t offset,int whence)
 參數fd是檔案描述符,它所指的開啟檔案描述將被調用修改
 當對檔案位移值規定一個新位置時,只需給一個數作為新值,一般來說,這個值相當於一個相對於檔案開始位置的位移值。另外兩種可能性是需要給出相對於當前檔案位置的位移值或者希望給出相對於檔案結束的位移值,這三種可能性以級用於選擇它們的符號常量表示在圖5-2中。
 參數offset是一個相對值,它被加到所選的基地址上,給出新的檔案位移值。參數whence可以取下列三個值中的一個(這些值定義在<unistd.h>檔案中)):
 * SEEK_SET  從檔案的開始處計算位移值
 * SEEK_CUR  從當前檔案的位移處行算位移值
 * SEEK_END  從檔案的結束處算算位移值

-------------------------------------------------------------------------------------------
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--------------------------------------------------------------------------------------------

 

 

 檔案操作(流)
 只有當一個流與栽個檔案或裝置關聯起來時,才可以對這個流進行各種操作,這就叫做流的開啟操作,只有在檔案存在,命名用者有對這個檔案進行開啟操作的許可權,且這個檔案沒有其它使用者鎖定的情況下,系統才允許對特定流實施開啟的操作,流的開啟操作才能成功,如果成功的話系統將返回一個FILE結構的指標,以 後各種操作都可以藉助這個結構指標。通過調用系統函數來完成了。
 下面這三個系統調用都可以開啟一個標準 輸入輸出資料流。
 #include <stido.h>
 FILE *fopen(const char *pathname,const char *type);
 FILE *freopen(const char *pathname,const char *type,FILE *fp);
 FILE *fdopen(int filedes,const char *type);
 這三個系統調用的不同特點在於
 fopen 開啟一個特定的檔案,檔案名稱由pathname指出。
 freopen在一個特定的流上開啟一個特定的檔案。首先關閉由FILE *fp指定的已開啟的流,然後開啟由pathname指定的流,它一般用於開啟一個特檔案以代替標準輸入資料流,標準輸出資料流,標準 錯誤輸出資料流等預定流。
 fdopen 將一個流對應到某個己開啟的檔案上,filedes就是這個檔案的描述符。這個調用只有在已開啟的模式和type定義的模式相同的情況下才能成功。這個已開啟的檔案一般是管道檔案或網路通訊管道,這些檔案沒有辦法通過標準輸入輸出函數fopen開啟,只有通過調用特定的裝置來得到檔案描述符,然後通過fdopen函數將一個流與這個檔案關聯起來。

 流的清洗操作。
 #include <stdio.h>
 int fflush(FILE *fp)
 int fpurge(FILE *fp)
 正確返回 0;
 錯誤返回 EOF;
 其中 FILE *fp就是某個已經開啟的流,它們的特點如下
 fflush將緩衝區的內容儲存在磁碟上,並清空緩衝區
 fpurge將緩衝區中所有的資料清除,包括未讀過或者未寫回的資料。這是一種破壞情的清除,是通過切斷緩衝區的電源來實現的。

 流的關閉操作。
 #include <stdio.h>
 int fclose(FILE *fp)
 正確返回:0
 錯誤返回:EOF

 流緩衝的屬性設定

 流對應的緩衝區的屬性包括緩衝區的大小和類型,緩衝區的類型有下面三種,它們有不同的特點
 全緩衝:當這種類型的緩衝區為滿時,才會執行真正的輸入輸出,即將緩衝器的資料儲存到磁碟上或輸出到終端裝置上,大部分情況下緩衝區都是這個類型的。
 行緩衝:這種情況下當緩衝區中輸入一個分行符號時,真正的輸入輸出就會發生,這種緩衝允許一次一個字元地在終端上輸出,代表情的行緩衝通常用在與終端裝置相連的緩衝區上。
無緩衝:這種情況下,一接受到字元,真正的輸入輸出就進行了,標準錯誤輸出資料流通常都是無緩衝的,這就是為什麼錯誤資訊一產生就會輸出,任何情況下都可能輸出在螢幕上的原因。
#include <stdio.h>
int setbuf(FILE *fp,char *buf);
int setbuffer(FILE *fp,char *buf,size_t size);
int setlinebuf(FILE *fp);
int setvbuf(FILE *fp,char *buf,int mode,size_t size);
正確返回:0
錯語返回:非0
這些系統調用中的FILE *fp是以經開啟的流,char *buf是使用者自己設定的緩衝區,size_t size是緩衝區的大小,int mode是流的類型,可以取_IOFBF,_IOLBT,_IONBF,分別代表全緩衝,行緩衝和無緩衝。調用這些系統函數時,必須以經開啟了流,這樣才有FILE *fp指標的存在。當然最好還沒有進行其它的操作,因為其它的操作是和緩衝的性質密切相關的。它們各自的特點
setbuf:如果buf為空白,則將緩衝區的類型設為無緩衝;否則,設定為緩衝,全緩衝的大小為下義常數BUFSIZ,它一般情況下可以當作啟用緩衝區的函數,把buf設為空白就禁止緩衝效果了。
setbuffer:這個函數與setbuf比較一致,只是在buf不為空白時,設定為全緩衝的大小不是系統預定值而是size。
setlinebuf:這個函數專門用來將緩衝區設定為行緩衝的
setvbuf:這個函數才是最基本的,前面的三個函數都可以從它演變過去.

流的定位操作(ftell,fseek)
#include <stdio.h>
long ftell(FILE *fp)
正確返回:訊寫指標的位置
錯誤返回:-1
int fseek(FILE *fp,long offset,int whence);
正確返回:0;
錯誤返回:非零;
void rewind(FILE *fp)
無傳回值
對以上三個函數的具體說明如下:
ftell:對於一個二進位檔案來說,檔案的訊寫指標是從檔案的開頭,以位元組為單位開始記數的,這個個值可以通過這個函數的調用來取得。
fseek:使用這個函數來定位二進位檔案,我們必須指出偏程量的大小offset和解釋使用這個偏量的方法whence 其中whence的取值可以有三種情況
SEEK_SET:從檔案開頭算位移
SEEK_CUR:從檔案當前位置位移
SEEK_END:從檔案結尾處計算位移
rewind:這個函數用來將讀寫的指標移動到檔案的開頭,我們注意思到這個函數沒有傳回值,系統預設為這個函數調用總是成功的。
前面的介紹都是對二進位檔案來說的,對於文字檔就有些不了,在一些非LINUX系統中文字檔讀寫指標的位置不是簡單的以位元組來記數的,因而不能使用ftell和fseek函數,在LINUX系統中使用fseek函數來定位文字檔時,也有一些限制。whence必須取SEEK_SET,offset的值只能取0或者由ftell得到的值,說明訪問文字檔只能從開頭或結尾進行。

fgetpos和fsetpos
#include <stido.h>
int fgetpos(FILE *fp,fpos_t *pos);
int fsetpos(FILE *fp,const fpos_t *pos);
正確返回:0
錯誤返回:非零
這兩個函數也是定位流的操作,fgetpos可以得到讀寫指標的位置而fsetpos可以定位讀寫指標的位置,它們和前面介紹的ftell和fseek有些區別:
fgetpos和fsetpos使用了一種抽象的資料結構,fpos_t。這是一個存放指標位置的記錄類型,在非LINUX系統中,fpos_t也可以被定義為存放檔案訊寫位置資訊的記錄類型。所以這兩個函數也可用於非LINUX系統。像 前面所說的對於文字檔的順就可以用這個函數來實現
ftell和fseek中讀寫指標的位置是用長整數來記錄的,只能使用於LINUX系統中。

-------------------------------------------------------------------------------------------
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--------------------------------------------------------------------------------------------

字元型輸入操作
下面三個系統調用就是允許我們一次讀入一個字元的函數
#include <stdio.h>
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);
檔案末尾或出錯返回:EOF;
首先來看一下這三個函數區別與聯絡
1.函數getchar的作用相當於調用函數getc(stdin),將標準輸入資料流作為能數傳進去。
2.函數getc與fgetc的區別在於,getc可以被當作宏來調用,而fgetc只可以作為函數調用,所以它們有如下的不同之處:
 a.函數getc的參數不能是有副作用的運算式
 b.由於fgetc是個函數我們可以把它當成其它函數的參數傳遞,而getc不可以。
 c.函數fgetc的調用比getc要花費更長的時間,把get作為一個宏就是為了提高效率而設計的。
接下來看一下這三個函數的傳回值的情況,它們都把下一個字元從unsigned char型轉化為int型,返回這個整數值,這樣做可以使所有可能的值能返回包括EOF字元,我們知道,在C語言中EOF的值為-1如果不是這樣的話,EOF的值就不能被返回了

區分檔案末尾和檔案出錯的方法
在前面的介紹中我們看到檔案的出錯和檔案結束的傳回值是相同的,都是EOF那麼怎麼區分這兩種情況呢通過下面的系統調用可以實現
#include <stdio.h>
int ferror(FILE *fp)
int feof(FILE *fp);
輸入正確時返回:非零
輸入不正確時返回:零

大多數情況下FILE結構中儲存這樣兩個標誌,一個為出錯標誌,另一個為結尾標誌,上面這兩個函數就是根據這兩個標誌做出判斷的,這兩個標誌都可以被 下面的函數清零
void clearerr(FILE *fp);

將字元推回緩衝區的操作
#include <stdio.h>
int ungetc(int c,FILE *fp)
正確返回:整數c
錯語返回:EOF
被推回符將在下一次的訊操作中被返回,原則上說它可以支援任何次數的推回字元操作,但是,應用中只需要一次就足夠了,而且推回多個字元也不是普啟遍的支援的,所以我們不提倡使用推回多個字元。
我們推回的字元不一定要求是上一個讀出的字元,EOF字元是不允許推回的,但當我們到達文的末尾時,我們可以推回某個字元,接下來的讀操作中,我們將得到這個字元,繼結的訊操作將得到EOF字元,
推回字元的操作用在編譯器中,在編譯過程中,有時我們需要多看一個字元,來決定如何處理當前的字元,有了這個函數我們可以將多看的那個字元推回,以備下次調用訊作時取得。

字元型輸出操作
#include <stdio.h>
int putc(int c,FILE *fp);
int fputc(int c,FILE *fp);
int putchar(int c,FILE *fp);
像三個輸入函數的關係一樣,putchar(c)相當於putc(c,stdout),而putc是作為宏來編碼的,fputc只是一個普通的函數。

一行型的輸入操作
#include <stdio.h>
char *fgets(char *buf,int n,FIEL *fp);
char *gets(char *buf);
正確返回:buf;
錯語返回:null 指標
其中這兩個函數都需要指出接收輸入緩衝區地址,即buf它們各自的特點如下:
 a. fgets需要明確接收的字元數n和流結構的指標fp,一般情況下它讀完一行,將這一行的內容,包括行結尾標誌,一起儲存到buf中,用Null 字元0來結束,這要種情況要求這一行的內容包括行結尾標誌在內,不能超過n-1個字元。如果超過了n-1個字元,那麼只有行的一部分被讀入,末尾用Null 字元來結束,下一次調用fgets時將讀這一行接下來的部分。
 b. gets是從標準輸入裝置輸入的。它是個有爭議的函數。其問題是允許調用者指定緩衝區的大小,如果一行的大小比緩衝區的大小大時,允許緩衝區溢位這樣一來,就會毀壞記憶體中緩衝區下面的內容。這種方法曾被用於製造病毒,所以雖然標準C提供了這個函數,但是使用者最好不要使用。

 一行型的輸出操作
 #include <stdio.h>
 int fputs(const char *str,FIEL *fp);
 int puts(const char *str);
 正確返回:非負數
 錯誤返回:EOF
 其中char *str為要輸出的字串,它們各自的特點如下:
  a. fputs函數的作用是把以字元0結尾的字串輸出到某個特定的流中,末尾字元0並不輸出,由於字串並沒有要求一定以分行符號結尾,所以這個函數也不一定是一次輸出一行的,大多數情況下是一次輸出一行但並不是必然的。
  b. puts函數的作用也是把以字元0結尾的字串輸出到標準輸出裝置上,同樣不輸出結尾字元0但是這個函數必定輸出一個分行符號,所以puts函數一定是一次輸出一行的,這個函數不像它的對應函數gets那樣不安全由於使用這個函數不必處理分行符號問題,所以它比fputs的應用更簡單

直接型輸入輸出操作
#include <stdio.h>
size_t fread(void *ptr,size_t size,size_t nobj,FILE *fp);
size_t fwrite(const void *ptr,size_t size,size_t nobj,FILE *fp);
返回:實際讀出或寫入的數目
其中,ptr是指向若干個結構的指標,這個結構就是輸入輸出的最小處理單位,size為結構的大小,一般用sizeof()函數求得;nobj是要處理的結構的個數,fp為流的指標。

載自:http://hi.baidu.com/phps/blog/item/5bf79613e410e4806438db31.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.