標C與Uinx C下檔案操作的對比

2021-06-18 06:02:18 字數 4575 閱讀 6977

operation

standard c

uccreate/

open

1.        開啟/建立新檔案    file*fopen(const char *filename,const char *type);

2.        重新開啟檔案:先關閉原檔案流並重新以fopen()方式開啟檔案

file *freopen(const char *filename, const char *type,file *sream);

3.rename更改檔名int  rename(const char *oldname, const char *newname);

1.       建立: #include int creat(const char *filename, mode_t mode);

2.開啟:#include

int open (const char *pathname, int flags);

int open (const char *pathname, int flags, mode_t mode);

o_trunc檔案存在,刪除內容

close

int fclose(file *stream);

#incliude int close(int fd);

remove

int remove(const char * filename);

#incliude int unlink (char * path);

write

1).字元輸出#include//成功返回寫入值,否則返回eof

int putc(int c,file *stream);//將c轉換為unsigned char 型別後寫入stream流中,並移動一位指標         int putchar(int c);   int fputc(int c,file *stream);

2).行輸出

//引數s指向一串以'\0'結尾的字元

int puts(cosnt char *s); //寫入stdout自動輸出\n

int fputs(const char *s,file *stream); //寫入stream中,不輸出\n

#include

char *strstr(char *s1,char *s2)返回s2第一次在s1中出現的位置的首位址

3).塊(block)寫(二進位制方式寫入/讀取)

成功返回n_items,否則返回值4).格式化寫: //等同printf()中內容輸出到檔案流/字串中

int fprintf(file *stream,const char *format,...);

int sprintf(char *s,const char format,...);

#incliude

int write(int fd, const void *buf, size_t length);

把length個位元組從buf寫到fd所指向的檔案中,返回值為實際寫入的位元組數。

read

1).字元輸入#include

結束/誤時返回eof(常數,一般為-1)

int getc(file *stream); //以unsigned char t讀取檔案內乙個字元,化為整數返回

int getchar(void);                int fgetc(file *stream);

2).行輸入#include

a.錯誤/結束返回null,成功返回s指向的位址從stdin中讀取字串至s,

char *gets(char *s)

b.從標準輸入流中讀取字串至指定大小的s中,錯誤/結束返回null

char *fgets(char *s,int n,file *stream)

3).塊(block)讀(二進位制方式寫入/讀取)

//成功返回n_items,否則返回值小於n_items,從stream中讀入n_items個資料項到ptr所指記憶體中,大小為size/資料項

size_t fread(void *ptr,size_t size,size_t n_items, file *stream);

#incliude

int read (int fd, const void *buf, size_t length); //從fd所指定的檔案中讀取length個位元組到buf,返回值為實際讀取的位元組數

buffer

#include

//引出setbuf()、setvbuf()有效呼叫時期:stream尚 未開啟或未執行讀寫操作前

//設定檔案流緩衝區,大小為buf,若buf=null,則完全關閉緩衝區

void setbuf(file * stream,char *buf);

//設定stream的緩衝區和緩衝模式(由type決定: _iofbf全緩衝,_iolbf行緩衝,_ionbf無緩衝)

int setvbuf(file *stream, char *buf,int type, size_t size )

int fflush(file *stream); //重新整理緩衝區

#incliude

//將所有寫入檔案fildes中資料真正寫入磁碟中,類似於fflush(),成0敗-1

int fsync(int fildes)

seek

1)改變檔案的訪問位置,whence表明定位方式( seek—set 0當前位置 seek—cur 1和檔案末尾 seek—end 2),offset為偏移量

int fseek(file *stream,long int offset,int whence)

2)重置流stream,將檔案流定位於開始處      void rewind(file *stream);

3)獲取當前訪問位置,成功返回位置,否則-1:    long int ftell(file * stream);

#incliude

//將讀寫指標相對whence移動offset個位元組。成功返回檔案指標相對於檔案頭的位置。

int lseek(int fd, offset_t offset, int whence);

whence 可用值: seek_set檔案開頭 seek_cur當前位置 seek_end檔案末尾

file desc

1).檔案的錯誤與結束狀態

int ferror(file *stream); //io錯誤時 !0,否則0

int feof(file *stream); //檔案結束時,返回 !0

void clearerr(file *stream); //清除stream錯誤和eof標誌

2).檔案的錯誤資訊   extern int errno; //表示錯誤**

#include char *strsrror(int errnum); //獲取錯誤的詳細資訊

1.        複製檔案描述符

#incliude

int dup(int fildes);   int dup2(int fildes,int fildes2);       

dup和dup2用於複製檔案描述符, dup2可以指定新的檔案描述符的數值,如果新的檔案描述符的值已經被使用,dup2會關閉掉後進行複製。dup和dup2不複製檔案表,只複製檔案描述符

file control(只有uc具備)

fcntl()對檔案描述符執行各種命令,cmd決定具體命令和有無第三引數

#include #include

/*cmd:① f_dupfd 複製檔案描述符,和dup2不同的是不會強行關閉已經使用的檔案描述符②f_getfd/f_setfd 獲取/設定檔案描述符標誌③f_getfl/f_setfl 獲取/設定檔案狀態標誌* /     int fcntl(int fd, int cmd);      int fcntl(int fd, int cmd,int arg);

int fcntl(int fd, int cmd,struct flock *arg); //f_setlk /f_getlk/f_setlkw獲取/設定檔案鎖,cmd值:f_setlk - 加鎖(鎖的型別是f_unlck時解鎖)   f_setlkw - 加鎖

經驗:1)設定狀態時用位或| , 判斷存在用位與&     2)讀鎖是共享鎖,允許其他程序讀,但不允許寫,寫鎖是獨佔鎖,不允許其他程序讀寫

3)用fcntl()加鎖,cmd使用f_setlk/f_setlkw加鎖。c用結構體flock代表檔案鎖:

struct flock;  

區別:①  f_setlk加鎖時,非阻塞,如果鎖加不上,直接返回-1;  ② f_setlkw加鎖時阻塞,如果鎖加不上,等待.  ③ f_getlk - 測試鎖能不能加上(不是取鎖)

檔案鎖只是在程序中做了鎖定的標識,並沒有真正鎖定檔案,因此檔案鎖無法限定對檔案讀寫。

檔案鎖的用法:凡是呼叫read之前上讀鎖,呼叫write之前上寫鎖才能有效果。(fcntl(f_setlk)不會鎖定任何東西,但可以與另乙個fcntl(f_setlk) 呼應)

f_getlk - 測試乙個鎖能不能加上(不是取鎖),如果能加,不真正加鎖,把鎖的型別改為f_unlck返回,如果不能加鎖,返回當前正在使用的鎖(原因),並改變pid的值為正在使用的鎖的pid。

判斷鎖能否加上的條件是pid是否= -1

python的with檔案操作與上下文

帶有 with 關鍵字的語句,它通常用在對於系統資源如檔案 資料庫連線 socket而言,應用程式開啟這些資源並執行完業務邏輯之後,必須做的一件事就是要關閉 斷開 該資源。比如 python 程式開啟乙個檔案,往檔案中寫內容,寫完之後,就要關閉該檔案,否則會出現什麼情況呢?極端情況下會出現 too ...

linux下檔案壓縮與解壓操作

原文,來自於這裡 對於剛剛接觸linux的人來說,一定會給linux下一大堆各式各樣的檔名給搞暈。別個不說,單單就壓縮檔案為例,我們知道在windows下最常見的壓縮檔案就只有兩種,一是,zip,另乙個是.rap。可是linux就不同了,它有.gz tar.gz tgz bz2 z tar等眾多的壓...

C 檔案操作與C 的檔案操作

c filestream 檔案流 主要用於使用二進位制方式讀寫檔案資料,可讀取任何檔案 建立filestream物件 e 建立filestream物件 filemode 指定系統開啟檔案的方式filestream fileaccess 指定檔案的訪問方式 read唯讀,write只寫,readwri...