c語言 帶緩衝的檔案 I O操作

2021-08-20 20:32:01 字數 3582 閱讀 3055

open操作

file *fopen(const char *path, const char *mode); //作用:開啟乙個檔案流,開啟失敗則返回null

file *freopen(const char *path, const char *mode, file *stream); //將乙個流進行重定向

file *fdopen(int fd,const char *mode); //將檔案描述符fd開啟乙個檔案流

mode選擇如下:

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

r+ 以讀/寫方式開啟檔案,該檔案必須存在。

rb+ 以讀/寫方式開啟乙個二進位制檔案,只允許讀/寫資料。

rt+ 以讀/寫方式開啟乙個文字檔案,允許讀和寫。

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

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

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

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

wb 以只寫方式開啟或新建乙個二進位制檔案,只允許寫資料。

wb+ 以讀/寫方式開啟或建立乙個二進位制檔案,允許讀和寫。

wt+ 以讀/寫方式開啟或建立乙個文字檔案,允許讀寫。

at+ 以讀/寫方式開啟乙個文字檔案,允許讀或在文字末追加資料。

ab+ 以讀/寫方式開啟乙個二進位制檔案,允許讀或在檔案末追加資料。

read操作

fgetc/getc從檔案中讀取乙個字元。getc 是乙個巨集操作

int fgetc(file * stream);//從引數stream所指的檔案中讀取乙個字元,返回讀取到的字元
注意:1,getc效率比fgetc高 2,返回eof表示到了檔案尾或出現了錯誤,須通過ferror或feof來區分這兩種情況

fgets/gets從檔案中讀取乙個字串。gets 是乙個巨集操作

char *fgets(char *buf, int bufsize, file *stream); //成功,則返回第乙個引數buf,否則返回null
fread以二進位制形式讀取檔案中的資料

size_t fread ( void *buffer, size_t size, size_t count, file *stream) ;//返回真實讀取的count數 

例如: fread(struct *a, sizeof(struct a), 1, fs); //讀乙個結構體a

例如: fread(buffer, sizeof(char), n, fs); //讀n個字元

write操作

fputc/putc寫乙個字元到檔案中去

int fputc (int c, file *fp); //函式返回寫入字元的ascii碼值,出錯時,返回eof(-1)
fputs/gets寫乙個字串到檔案中去

int fputs(const char *str, file *stream);//該函式返回乙個非負值,錯誤則返回 eof(-1)。
fwrite以二進位制形式寫入資料到檔案

size_t fwrite(const void* buffer, size_t size, size_t count, file* stream);//返回實際寫入的資料塊數目
fflush清除讀寫緩衝區,立即緩衝區的資料進行物理寫入

int fflush(file *stream);//成功返回0,錯誤返回eof
fprintf & sprintf & snprintf輸出重定向

int fprintf (file* stream, const char*format, [argument])

例子: fprintf(stream, "%s%c", s, c); //s為字串指標,c為字元資料

int sprintf( char *buffer, const char *format, [ argument] … );

例子: sprintf( buffer,"string:%s\n", s ); //s為字串指標

int snprintf(char *str, size_t size, const char *format, ...);

字串長度sscanf輸入重定向,配合正規表示式功能強大

int sscanf(const char *buffer,const char *format, [ argument ] ...); //可以指定規則,從字串中取出需要的部分

feof判斷是否到檔案結尾

int feof(file *stream); //如果檔案結束,則返回非0值,否則返回0
ferror判斷讀/寫檔案操作是否正常。(某些讀寫操作是巨集操作,無返回值)

int ferror(file *stream); //返回0表示正常
clearerr清除檔案錯誤標誌

void clearerr(file *stream); //清除檔案錯誤標誌
rewind重置檔案指標到開頭

void rewind(file *fp); //把檔案指標指向檔案開始
fseek檔案指標定位

int fseek(file *stream, long offset, int fromwhere); //檔案指標定位,與lseek作用類似
ftell獲取檔案指標當前位置

long ftell(file *stream); //得到檔案位置指標當前位置相對於檔案首的偏移位元組數
fileno通過檔案流得到檔案描述符

int fileno(file *stream); //通過file得到檔案操作符fd
**tmpnam, tmpfile ** //建立臨時檔案,沒有記憶體方便

mmap//將某個檔案內容對映到記憶體中,可以直接操作

帶緩衝的IO和不帶緩衝的IO

首先說說帶緩衝的i o是什麼意思,在unix環境高階程式設計裡面,是這樣解釋的 術語不帶緩衝指的是每個read和write都呼叫核心中的乙個系統呼叫。所有的磁碟i o都要經過核心的塊緩衝 也稱核心的緩衝區快取記憶體 唯一例外的是對原始磁碟裝置的i o。既然read或write的資料都要被核心緩衝,那...

帶緩衝的IO和不帶緩衝的IO

檔案描述符 檔案描述符是乙個小的非負整數,是核心用來標識特定程序正在訪問的檔案 標準輸入 輸出 出錯 shell為每個程式開啟了三個檔案描述符,stdin fileon,stdout fileon,stderr fileon,預設這三個檔案描述符都鏈向終端 不帶緩衝的io 函式open read w...

C C 檔案I O操作緩衝檔案操作

緩衝區是為程式分配的記憶體塊,在進行資料量比較大且不要求實時性的 i o 操作時,一部分資料被置於緩衝區中,只有當資料的長度快要超過緩衝區範圍或時間週期達到時,這些資料才被送入指定的位置。基於緩衝區的檔案 i o 操作減少了對裝置的物理資料介面 訪問次數,從而使大量資料的 i o 操作的系統開支減少...