Linux應用開發:標準IO庫(上)
文章目錄
linux應用開發:標準IO庫(上)
一、標準IO庫簡介
二、流和 FILE 對象
三、標準輸入、輸出、錯誤
四、標準 I/O 庫函數操作文件
4.1 打開關閉文件
4.2 讀文件
4.3 寫文件
4.4 定位文件
Linux應用開發:標準IO庫(上)
一、標準IO庫簡介
標準 I/O 庫是標準 C 庫中用于文件 I/O 操作(讀、寫文件等操作)相關的一系列庫函數的集合,通常標準 I/O 庫函數相關的函數定義都在
標準 I/O 庫函數 本質上就是構建于文件 I/O(open()、read()、write()、lseek()、close()等)這些系統調用之上,對這些系統調用進行了封裝
標準 I/O 和文件 I/O 的區別:
標準 I/O 是標準 C 庫函數,而文件 I/O 則是 Linux 系統調用
標準 I/O 內部實際上是調用文件 I/O 來完成實際操作的
標準 I/O 相比于文件 I/O 具有更好的可移植性,系統調用對不不同版本系統可能不同,但標準 I/O 一般都是統一封裝,更加規范,容易移植
標準 I/O 庫在用戶空間維護了自己的 stdio 緩沖區,所以 標準 I/O 是帶有緩存的,而 文件 I/O 在用戶空間是不帶有緩存的,所以在性能、效率上,標準 I/O 要優于文件 I/O
二、流和 FILE 對象
在系統調用中,所有文件 I/O 函數(open()、read()、write()、lseek()等)都是圍繞文件描述符進行的,而對于標準 I/O 庫函數來說,它們的操作是 圍繞 FILE 指針進行的;
在使用標準 I/O 庫函數打開或創建一個文件時,會返回一個指向 FILE 類型對象的指針(FILE *),標準 I/O 的所有文件操作都是圍繞這個指針進行;
FILE 是一個結構體,包含了標準 I/O 庫函數為管理文件所需要的所有信息,包括用于系統調用的文件描述符、指向文件緩沖區的指針、緩沖區的長度、當前緩沖區中的字節數以及出錯標志等。FILE 數據結構定義在標準 I/O 庫函數頭文件 stdio.h 中
三、標準輸入、輸出、錯誤
標準輸入:
標準輸入設備指的就是計算機系統的標準的輸入設備,通常指的是計算機所連接的鍵盤
標準輸出:
標準輸出設備指的是計算機系統中用于輸出標準信息的設備,通常指的是計算機所連接的顯示器
標準錯誤:
標準錯誤設備則指的是計算機系統中用于顯示錯誤信息的設備,通常也指的是顯示器設備
用戶通過標準輸入設備與系統進行交互,進程將從標準輸入(stdin)文件中得到輸入數據,將正常輸出數據(譬如程序中 printf 打印輸出的字符串)輸出到標準輸出(stdout)文件,而將錯誤信息(譬如函數調用報錯打印的信息)輸出到標準錯誤(stderr)文件
所以標準輸入、輸出、錯誤都是圍繞文件的操作,所以每個進程啟動之后都會默認打開標準輸入、標準輸出以及標準錯誤,得到三個文件描述符,即 0、1、2,其中 0 代表標準輸入、1 代表標準輸出、2 代表標準錯誤
應用編程中 可以使用宏 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 分別代表 0、1、2,宏定義在 unistd.h 頭文件
/* Standard file descriptors. */ #define STDIN_FILENO 0 /* Standard input. */ #define STDOUT_FILENO1 /* Standard output. */ #define STDERR_FILENO 2 /* Standard error output. */
1
2
3
4
以上的是文件描述符,在標準 I/O 中如果要對這三個文件進行操作,則要對 FILE 對象進行操作,在 unistd.h 頭文件中定義如下:
/* Standard streams. */ extern struct _IO_FILE *stdin; /* Standard input stream. */ extern struct _IO_FILE *stdout; /* Standard output stream. */ extern struct _IO_FILE *stderr; /* Standard error output stream. */ /* C89/C99 say they're macros. Make them happy. */ #define stdin stdin #define stdout stdout #define stderr stderr
1
2
3
4
5
6
7
8
9
struct _IO_FILE 結構體就是 FILE 結構體,只不過用 typedef 進行了重命名
所以在標準 I/O 中,stdin、stdout、stderr 來表示標準輸入、標準輸出和標準錯誤
四、標準 I/O 庫函數操作文件
4.1 打開關閉文件
標準 I/O 中,使用庫函數 fopen() 打開或創建文件,函數原型如下:
#include
1
2
使時需要包含頭文件 stdio.h
函數參數和返回值含義:
參數 mode 補充:
打開的文件通過 fclose() 進行關閉,關閉函數原型如下:
#include
1
2
參數 stream 為文件流指針,調用成功返回 0;失敗將返回 EOF(也就是-1),并且會設置 errno 來指示錯誤原因
4.2 讀文件
使用 fread() 對文件進行讀操作,函數原型如下:
#include
1
2
參數和返回值含義:
4.3 寫文件
fwrite() 庫函數進行寫操作,函數原型如下:
#include
1
2
參數和返回值含義:
4.4 定位文件
庫函數 fseek() 用于設置文件讀寫位置偏移量,和 lseek() 功能相同,但 lseek() 用于文件 I/O,而庫函數 fseek() 則用于標準 I/O,函數原型:
#include
1
2
函數參數和返回值含義
庫函數 ftell() 可用于獲取文件當前的讀寫位置偏移量,函數原型如下:
#include
1
2
參數 stream 指向對應的文件,函數 調用成功將返回當前讀寫位置偏移量;調用失敗將返回-1,并會設置 errno 以指示錯誤原因
Linux
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。