摘要:本文主要總結了以下有關檔案讀寫的IO,系統呼叫與庫函式。
1.初級IO函式:close,creat,lseek,open,write
檔案描述符是一個整型數
1.1close
1.2int creat(const char * pathname, mode_t mode);
1.3off_t lseek(int fildes,off_t offset ,int whence)
定義函式
函式說明
引數
返回值
1.4int open(const char *pathname, int flags);
1.5ssize_t write (int fd,const void * buf,size_t count);
返回值:如果順利write()會返回實際寫入的位元組數。當有錯誤發生時則返回-1,錯誤程式碼存入errno中。
0)非緩衝檔案系統依賴於作業系統,通過作業系統的功能對檔案進行讀寫,是系統級的輸入輸出,它不設檔案結構體指標,只能讀寫二進位制檔案,但效率高、速度 快,由於ANSI標準不再包括非緩衝檔案系統,因此建議大家最好不要選擇它。
1)關於系統呼叫
read和write屬於初級讀寫函式,也是系統呼叫;系統呼叫需要消耗大量時間。因為程式碼執行權會從使用者轉移到核心,執行核心程式碼是需要時間的。系統呼叫開銷巨大,因為系統呼叫需要特殊的記憶體和堆疊環境,這些需要在系統呼叫之前建立好;系統呼叫之後又需要恢復這些環境。這種環境切換需要耗費大量時間。最好的方法就是建立緩衝區,一次讀取大量資料,避免多次進行系統呼叫。我們可以用這個思想來改造前一篇中的who。
2)系統呼叫的錯誤處理
一般約定,系統呼叫open,write,lseek在出錯時會返回值-1。另外,系統呼叫都有自己的錯誤集,以open為例,開啟檔案不存在,沒有讀的許可權,開啟檔案太多等等。核心通過全域性變數errno來確定錯誤型別,其中哦功能error.h中規定了一些錯誤的巨集。
2.標準IO函式
2.1int fclose(FILE *stream);
如果流成功關閉,fclose 返回 0,否則返回EOF(-1)
2.2int feof(FILE *stream)
feof(fp)有兩個返回值:如果遇到檔案結束,函式feof(fp)的值為非零值,否則為0。
2.3int fgetc(FILE *stream);
這個函式的返回值,是返回所讀取的一個位元組。如果讀到檔案末尾或者讀取出錯時返回EOF。
2.4char *fgets(char *buf, int bufsize, FILE *stream)
fopen從檔案結構體指標stream中讀取資料,每次讀取一行。讀取的資料儲存在buf指向的字元陣列中,每次最多讀取bufsize-1個字元(第bufsize個字元賦'\0'),如果檔案中的該行,不足bufsize個字元,則讀完該行就結束。函式成功將返回buf,失敗或讀到檔案結尾返回NULL。因此我們不能直接通過fgets的返回值來判斷函式是否是出錯而終止的,應該藉助feof函式或者ferror函式來判斷。bufsize的作用是防止緩衝區溢位。
2.5FILE * fopen(const char * path,const char * mode);
檔案順利開啟後,指向該流的檔案指標就會被返回。如果檔案開啟失敗則返回NULL,並把錯誤程式碼存在errno 中。
2.6int fputc (int n, File *fp)
功能:輸出一個字元到某個檔案
2.7size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
2.8int fseek(FILE *stream, long offset, int fromwhere);
2.9size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream)
2.10int getc(FILE *stream);
注意: 此函式被ISO C宣告為一個巨集,所以在用時不能將其做為函式指標傳(有一些編譯器將其以函式形式也給另說)。
2.11getchar()
從stdio流中讀字元,相當於getc(stdin),它從標準輸入裡讀取下一個字元。
2.12gets
從stdin流中讀取字串,直至接受到換行符或EOF時停止,並將讀取的結果存放在buffer指標所指向的字元陣列中。換行符不作為讀取串的內容,讀取的換行符被轉換為null值,並由此來結束字串。
2.13int fputc(char ch,FILE*fp)
putc()與fputc()等價。不同之處為:當putc函式被定義為巨集時,它可能多次計算stream的值。
2.14 int putchar(int ch);
在標準輸出上輸出一個字元
2.15int puts(char *string);
功能:送一字串到流stdout中
緩衝檔案系統的特點是:在記憶體開闢一個“緩衝區”,為程式中的每一個檔案使用,當執行讀檔案的操作時,從磁碟檔案將資料先讀入記憶體“緩衝區”, 裝滿後再從記憶體“緩衝區”依此讀入接收的變數。執行寫檔案的操作時,先將資料寫入記憶體“緩衝區”,待記憶體“緩衝區”裝滿後再寫入檔案。由此可以看出,記憶體 “緩衝區”的大小,影響著實際操作外存的次數,記憶體“緩衝區”越大,則操作外存的次數就少,執行速度就快、效率高。一般來說,檔案“緩衝區”的大小隨機器 而定。
3.格式化輸出輸出函式
3.1printf
3.2int fprintf(FILE *stream,char *format,[argument])
功能:格式化輸出到一個流/檔案中;
返回值:fprintf()的返回值是輸出的字元數,發生錯誤時返回一個負值.
3.3scanf
3.4int fscanf(FILE *stream, char *format,[argument...]);
功 能: 從一個流中執行格式化輸入,fscanf遇到空格和換行時結束,注意空格時也結束。這與fgets有區別,fgets遇到空格不結束。