文件系統編程——標準I/O庫

printf函數向標準輸出寫入多個字符,所寫入的字符被放在一個用戶態的緩衝區中,直到碰到一個換行符,系統才調用write函數將緩衝區中的數據寫入標準輸出,也就是說,在換行符之前寫入的字符並不會立即出現在控制檯屏幕上。
系統調用要請求內核的服務,會引發CPU模式的切換,期間會有大量的堆棧數據保存操作,開銷比較大。如果頻繁地進行系統調用,會降低應用程序的運行效率。有了緩衝機制以後,多個讀寫操作可以合併爲一次系統調用,減少了系統調用的次數,將大大提高程序的運行效率。

標準I/O函數並不直接操作文件描述符,而是使用文件指針。文件指針和文件描述符是一一對應的關係,這種對應關係由標準I/O庫自己內部維護。文件指針指向的數據類型爲FILE型,但應用程序無須關心它的具體內容。
在標準I/O中,一個打開的文件稱爲流(stream),流可以用於讀(輸入流)、寫(輸出流)或讀寫(輸入輸出流)。每個進程在啓動後就會打開三個流,分別對應:stdin(標準輸入流)、stdout(標準輸出流)以及stderr(標準錯誤輸出流)。

 fopen用於打開一個標準I/O流
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);

參數mode:
r”或”rb”:以只讀方式打開。
“w”或”wb”:以只寫方式打開,並把文件長度截短爲零。
“a”或”ab”:以寫方式打開,新內容追加在文件尾。
“r+”或”rb+”或”r+b”:以更新方式打開(讀和寫)。
“w+”或”wb+”或”w+b”:以更新方式打開,並把文件長度截短爲零。
“a+”或”ab+”或”a+b”:以更新方式打開,新內容追加在文件尾

fread()用於從一個文件流裏讀取數據。
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
 fclose()函數用於關閉指定的文件流。
#include <stdio.h>
int fclose(FILE *fp);

出了這幾個主要的操作,還有一些其他的操作

fflush()用於把文件流裏所有未寫出的數據立即寫出。
#include <stdio.h>
int fflush(FILE *stream);  

fseek()用於在文件流裏爲下一次讀寫操作指定位置。
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence); 
fgetc()從文件流裏取出下一個字節並把它作爲一個字符返回。當它到達文件結尾或出現錯誤時,返回EOF。getc()和fgetc()一樣,但它有可能被實現爲一個宏。getchar()相當於getc(stdin)。
#include <stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void);
fputc()把一個字符寫到一個輸出文件流中,它返回寫入的值,如果失敗,則返回EOF。類似fgetc()和getc(),putc()的作用也相當於fputc(),但它可能被實現爲一個宏。putchar()相當於putc(c, stdout),它把單個字符寫到標準輸出。
#include <stdio.h>
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);

關於文件的操作大概也就這些了。在我們進一步的學習之後,用的更多的還是標準I/O庫中的內容,在以後的學習中相信文件編程的內容會起到很大的作用。

發佈了53 篇原創文章 · 獲贊 11 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章