Linux應用開發標準IO庫(上)

      網友投稿 814 2022-05-29

      文章目錄

      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 FILE *fopen(const char *path, const char *mode);

      1

      2

      使時需要包含頭文件 stdio.h

      函數參數和返回值含義:

      參數 mode 補充:

      打開的文件通過 fclose() 進行關閉,關閉函數原型如下:

      #include int fclose(FILE *stream);

      Linux應用開發:標準IO庫(上)

      1

      2

      參數 stream 為文件流指針,調用成功返回 0;失敗將返回 EOF(也就是-1),并且會設置 errno 來指示錯誤原因

      4.2 讀文件

      使用 fread() 對文件進行讀操作,函數原型如下:

      #include size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

      1

      2

      參數和返回值含義:

      4.3 寫文件

      fwrite() 庫函數進行寫操作,函數原型如下:

      #include size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

      1

      2

      參數和返回值含義:

      4.4 定位文件

      庫函數 fseek() 用于設置文件讀寫位置偏移量,和 lseek() 功能相同,但 lseek() 用于文件 I/O,而庫函數 fseek() 則用于標準 I/O,函數原型:

      #include int fseek(FILE *stream, long offset, int whence);

      1

      2

      函數參數和返回值含義

      庫函數 ftell() 可用于獲取文件當前的讀寫位置偏移量,函數原型如下:

      #include long ftell(FILE *stream);

      1

      2

      參數 stream 指向對應的文件,函數 調用成功將返回當前讀寫位置偏移量;調用失敗將返回-1,并會設置 errno 以指示錯誤原因

      Linux

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:機器人編程趣味實踐10-做個任務(行動)
      下一篇:華為云ModelArts完整流程引導——貼心的細致-幫你1小時完成整個訓練過程 | 華為云AI賀新年
      相關文章
      亚洲日韩中文字幕日韩在线| 学生妹亚洲一区二区| 中文字幕亚洲码在线| 亚洲黄色三级网站| 亚洲国产精品综合久久网络| 四虎精品亚洲一区二区三区 | 最新亚洲春色Av无码专区| 亚洲精品国产精品国自产网站| 亚洲综合一区二区精品久久| 亚洲国产老鸭窝一区二区三区 | 亚洲GV天堂无码男同在线观看| 亚洲熟妇无码八V在线播放| 亚洲色大成网站www永久男同 | 亚洲精品国产suv一区88| 亚洲另类无码专区首页| 国产精品亚洲综合久久| 亚洲中文字幕无码av永久| 亚洲人成网站在线播放2019| 亚洲国产欧美国产综合一区| 亚洲精品无码久久久久A片苍井空 亚洲精品无码久久久久YW | 亚洲欧洲日韩国产综合在线二区| 亚洲精品在线观看视频| 麻豆亚洲AV永久无码精品久久| 亚洲福利视频网站| 亚洲xxxxxx| 亚洲欧美国产国产综合一区| 亚洲JIZZJIZZ妇女| 亚洲欧洲日产国码高潮αv| 国产亚洲成归v人片在线观看 | 亚洲国产午夜精品理论片在线播放 | 亚洲视频免费在线播放| 亚洲中文字幕久在线| 亚洲av永久无码| 亚洲国产精品日韩| 亚洲一区二区三区影院| 亚洲第一精品在线视频| 最新亚洲卡一卡二卡三新区| wwwxxx亚洲| 国产区图片区小说区亚洲区| 亚洲人成亚洲人成在线观看 | 妇女自拍偷自拍亚洲精品|