LINUX 檔案操作

2021-08-19 19:39:29 字數 3715 閱讀 7134

首先,任意程序在執行時都預設開啟了3個流物件,這三個流物件分別是stdin,stdout,stderr,,這3個流物件作為全域性變數被引進到每個程序中,但ansi c庫函式是在使用者態實現,流的相應資源也存在於使用者態,但無論如何最終都需要通過核心實現對檔案的讀寫控制,因此,在fopen()系列函式中必然呼叫了對作業系統的系統呼叫,這一系統呼叫在linux下即為open,write,close,read等函式,這些函式都遵循posix標準,這一標準在內unix 中遵循。那麼在linux中怎麼表述乙個開啟的檔案呢?

對於使用者空間來說,任何開啟的的檔案都將被分配乙個唯一非負整數,用於表述該檔案,即檔案描述符為乙個大於等於0的整數,因此任何程序都在執行時預設開啟3個流物件(stdin,stdout,stderr)預設為0,1,2.

函式原型:int _fileno( file *stream );

函式功能:fileno()用來取得引數stream指定的檔案流所使用的檔案描述符

返回值:某個資料流的檔案描述符

#include 

int main( void )

the file descriptor for

stdin is 0

the file descriptor for

stdout is 1

the file descriptor for

stderr is 2

file* fdopen(int fd, const char* type);

說明:

fdopen()會將引數fildes 的檔案描述詞,轉換為對應的檔案指標後返回。引數mode 字串

則代表著檔案指標的流形態,此形態必須和原先檔案描述詞讀寫模式相同。

mode有下列幾種形態字串:

r 開啟唯讀檔案,該檔案必須存在。

r+ 開啟可讀寫的檔案,該檔案必須存在。

w 開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。

w+ 開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。

a 以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。

a+ 以附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。

返回值:

轉換成功時返回指向該流的檔案指標。失敗則返回null,並把錯誤**存在errno中。

示例:

#include

main()

fclose是乙個函式名,功能是關閉乙個流。注意:使用fclose()函式就可以把緩衝區內最後剩餘的資料輸出到核心緩衝區,並釋放檔案指標和有關的緩衝區。

函式原型:int fclose( file *fp );

返回值:如果流成功關閉,fclose 返回 0,否則返回eof(-1)。(如果流為null,而且程式可以繼續執行,fclose設定error number給einval,並返回eof。)

#include

#include

int main(void)

int open(constchar*pathname,intflags,…);

第乙個引數是欲開啟的檔案路徑,第二個是開啟的方式,對於open函式來說,第三個引數僅當建立新檔案時(即 使用了o_creat 時)才使用,用於指定檔案的訪問許可權位(access permission bits)。pathname 是待開啟/建立檔案的posix路徑名(如/home/user/a.cpp);flags 用於指定檔案的開啟/建立模式,這個引數可由以下常量(定義於fcntl.h)通過邏輯位或邏輯構成。

第二個引數常用:

o_rdonly唯讀模式

o_wronly只寫模式

o_rdwr讀寫模式

o_creat若開啟檔案不存在則自動建立

open返回的檔案描述符一定是最小的未被使用的描述符。

當對完成對檔案的操作後,應當關閉檔案,將相應的類容全部寫回到檔案中,即讓資料寫入磁碟,使用close函式關閉檔案,其函式宣告如下:

extern int close(int fd );

此函式只有乙個引數,該函式為呼叫ope函式開啟檔案時返回的檔案描述符,如果呼叫成功則返回0;否則返回-1.

除了在open函式使用o_creat引數來建立檔案外,還可以採用creat()函式來建立,函式宣告如下:

extern int create(_const char * _file,mode_t _mode);

第乙個引數char* file為欲建立檔案的路徑,第二個引數為該檔案的訪問許可權

若呼叫成功返回所建立的檔案的檔案描述符,如有錯誤反回-1,並把錯誤**設定為errno.

函式read()從指定的檔案讀取指定大小的資料,宣告如下:

extern ssize_t read(int _fd,void *buf,size_t _nbytes);

read()會把引數fd所指的檔案傳送nbyte個位元組到buf指標所指的記憶體中。若引數nbyte為0,則read()不會有作用並返回0。返回值為實際讀取到的位元組數,如果返回0,表示已到達檔案尾或無可讀取的資料。錯誤返回-1,並將根據不同的錯誤原因適當的設定錯誤碼。

#include 

#include

#include

#include

#include

#include

int main(void)

bytes=read(handle,buf,10);

if(bytes==-1)

else

return0 ;

}

開啟檔案後,可以通過write函式往其中寫入資料,宣告如下:

extern ssize_t write (int _fd,__const void *_buf,size_t _n);

write()會把指標buf所指的記憶體寫入count個位元組到引數fd所指的檔案內。當然,檔案讀寫位置也會隨之移動

返回值:如果順利write()會返回實際寫入的位元組數。當有錯誤發生時則返回-1,錯誤**存入errno中

示例:

#include

#include

#include

#include

#include

#include

int main(void)

strcpy(string,"hello,world!\n");

length=strlen(string);

if((res=write(handle,string,length))!=length)

printf("wrote%dbytestothefile.\n",res);

close(handle);

return

0;}

錯誤**:

eintr 此呼叫被訊號所中斷。

eagain 當使用不可阻斷i/o 時(o_nonblock),若無資料可讀取則返回此值。

ebadf 引數fd非有效的檔案描述詞,或該檔案已關閉。

linux 檔案操作

1 cat 開啟檔案 cat name.txt 開啟檔案name.txt cat 1.txt 2.txt 開啟2個檔案 cat n name.txt 開啟檔案後顯示行號 2 vi 輸出,刪除,查詢,替換,塊操作 等文字操作 vi 的三種基本工作模式 命令列模式,文字輸入模式,末行模式 命令列模式 不...

Linux 檔案操作

1,查詢檔案 find name 名稱 ls find atime 10 記著有乙個點號 兩邊都有空格,代表當前目錄,如果希望顯示系統的所有大於10天的檔案 可以將 換成 代表根目錄 find mtime n print n天前那天改過的檔案 find mtime n print n天以前改過的檔案...

linux檔案操作

unix檔案操作 讀寫操作 標c檔案讀寫 file 代表乙個開啟的檔案 unix linux的檔案讀寫函式 linux系統中 幾乎一切都是檔案,記憶體 目錄 硬體裝置都可以看成檔案。比如 記憶體 對應目錄 proc pid 目錄 可以用 vi 檢視,也是檔案 裝置 dev tty 鍵盤 顯示器 de...