-
概念
標準IO:指的是C語言實現的文件操作的函數
系統IO(文件IO):指的是linux或windows或unix,實現文件操作的函數。 -
為什么要有兩種IO
C語言要實現跨平臺,所以C語言在不同操作系統中實現文件操作方式是不一樣的
因為:標準IO函數會去調用系統IO函數 -
它們主要的區別
標準IO有緩沖區,系統IO沒有緩沖區 -
緩沖模式
全緩沖模式:程序員自己打開的文件流
1、當緩沖區滿了,會實際執行IO操作。
2、當執行fclose函數或fflush函數(不管緩沖區是否是滿的,
強制執行IO操作,刷新緩沖區的數據)
3、當程序退出的時候,操作系統會幫我們把所有已打開的文件流進行關閉
行緩沖模式:stdin,stdout
1、行緩沖區滿了,會執行執行IO操作。
2、當緩沖區中存在了換行操作符\n,會執行IO操作。
無緩沖模式:stderr -
文件描述符
C程序啟動起來以后,會有三個默認的文件被打開,
stdin(標準輸入,編號0)、stdout(標準輸出,編號1)、stderr(標準錯誤,編號2)
如果我們也打開了一個fopen打開了一個文件,那么這個文件的編號就是3
這種編號就稱為文件描述符 -
流的概念
stream 流:形象的比喻數據的流向。
輸入流:數據從文件到內存,I:Input
輸出流:內存流向文件,O:output
生活中水流,有方向的 -
標準IO相關函數
打開文件流:
FILE *fopen(const char *pathname, const char *mode);根據文件的路徑,使用不同打開模式,打開一個文件,返回值是一個文件流FILE *fdopen(int fd, const char *mode);fd:文件描述符,socket 已經打開了一個文件,socket和文件結合起來,就可以使用fdopen。FILE *freopen(const char *pathname, const char *mode, FILE *stream);重新打開文件流,以前設置的文件流的屬性,會被重置
按照文本方式讀流:
int fgetc(FILE *stream):從流中讀取一個字符,返回值是負數代表的是讀失敗了,整數和0代表讀出來的字符char *fgets(char *s, int size, FILE *stream):從stream中讀取size個字符,讀到s緩沖區中;讀到內容返回是s,讀不到內容返回NULLint getc(FILE *stream):同fgetcint getchar(void):從控制臺拿一個字符,等同于getc(stdin)int ungetc(int c, FILE *stream):c字符放入stream流的后邊,相當于將c追加到stream中
按照文本方式寫流:
int fputc(int c, FILE *stream):將字符c寫入到stream中,如寫成功返回c的int值,寫失敗返回的EOFint fputs(const char *s, FILE *stream):將字符串s寫入到stream中,如果成功返回寫入的個數,如果失敗返回EOFint putc(int c, FILE *stream):同fputcint putchar(int c):往控制臺輸出一個字符串,等同于putc(c, stdout)int puts(const char *s):往控制臺輸出一行字符串,等同于fputs(s,stdout)
按照二進制方式讀寫流:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream):從stream中讀取nmemb*size個字節,放到ptr中。成功:返回的是讀到了多少個單元數據失敗:若出現錯誤或到達文件末尾,則返回值可能小于nmemb或0。size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream):從ptr中讀取nmemb*size個字節,然后寫入到stream中。成功:返回的是寫入了多少個單元數據失敗:若出現錯誤,則返回值可能小于nmemb或0
檢查或者重置流狀態:
void clearerr(FILE *stream):clearerr函數就是要復位這些錯誤標志,也就是使fp所指向的文件的錯誤標志和文件結束標志置0,從而使文件恢復正常。int feof(FILE *stream):檢測流上的文件結束符,如果文件結束,則返回非0值,否則返回0int ferror(FILE *stream):如果ferror返回值為0(假),表示未出錯。如果返回一個非零值,表示出錯。應該注意,對同一個文件 每一次調用輸入輸出函數,均產生一個新的ferror函 數值,因此,應當在調用一個輸入輸出函數后立即檢 查ferror函數的值,否則信息會丟失int fileno(FILE *stream):獲取已經打開的文件描述符(用于獲取系統io的文件描述符)
刷新流:
int fflush(FILE *stream):強制刷新輸出緩沖區中的內容到文件中。stream為NULL,將強制刷新進程中的所有緩沖區stream是一個指定的文件流,會刷新stream輸出緩沖區到文件中
重新定位流:
int fseek(FILE *stream, long offset, int whence);whence=SEEK_SET,offset=10,從文件的頭開始計算,偏移10個字節whence=SEEK_CUR,offset = 2,從文件當前位置開始計算,向后偏移2個字節whence=SEEK_CUR,offset = -2,從文件當前位置開始計算,向前偏移2個字節whence=SEEK_END,offset = -2,從文件最后位置開始計算,向前偏移2個字節whence=SEEK_END,offset = 100,從文件最后位置開始計算,向后偏移100個字節設置成功:返回0設置失敗:返回非0fseek函數限制是文件大小不能超過2G
long ftell(FILE *stream):獲取當前文件的位置指針
void rewind(FILE *stream):文件位置指針設置到文件開頭,等價于:(void) fseek(stream, 0L, SEEK_SET)
int fgetpos(FILE *stream, fpos_t *pos):等價于:ftell(從文件頭開始計算)
int fsetpos(FILE *stream, const fpos_t *pos):等價于fseek函數(whence==SEEK_SET)
int fseeko(FILE *stream, off_t offset, int whence):和fseek類似,但是擴展了long的長度,前提是要加入宏_FILE_OFFSET_BITS
off_t ftello(FILE *stream):類似于ftell