天天看點

APUE讀書筆記(7) 标準IO庫(下)

第五章 标準IO庫(下)

一:每次一行IO

  下面的兩個函數提供每次輸入一行IO的功能:

char *fgets(char *restrict buf, int n, FILE restrict fd);
char *gets(char *buf);
成功傳回buf,失敗傳回NULL
           

  這裡我們并不推薦使用gets這個函數,因為他不指定讀入緩沖區的資料大小,容易造成緩沖區溢出,當最後一行超過了緩沖區的長度的時候,就會出現該問題。

  輸出一行IO的函數有如下兩個:

int fputs(const char *restrict buf, FILE restrict fd);
int puts(const char *str);
成功傳回
           

  puts函數也容易造成緩沖區溢出的問題,是以也要盡量避免使用。

二:二進制IO

  在某些情況下,我們不希望在進行讀取操作的時候遇到null就停止,而是希望一次性讀取完;寫的情況也是這樣,這時就需要用到下面兩個函數

size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);
size_t fwrite(const void *restrict ptr, size_t size size_t nobj, FILE *restrict fp);
傳回值:讀或寫的對象數
           

  但是使用二進制IO還會遇到一個問題:對于同一個二進制檔案,可能由于不同作業系統對偏移量的處理或者是對于浮點數的處理不一樣導緻一個二進制檔案到了另一個系統就不可用了。

三:格式化IO

  格式化的輸出是由五個printf函數來處理的

APUE讀書筆記(7) 标準IO庫(下)

  printf使我們用的最多的一個格式化輸出函數,它将格式化的資料寫入到标準輸出中;fprintf會寫到指定的流;dprintf寫到指定的檔案描述符;sprintf寫入到一個char 緩沖區中,它會自動的在末尾加入一個null,但是null不包含在傳回的值中;snprintf規定了寫入的大小,這是由于sprintf可能會由于buf緩沖區大小不夠導緻的緩沖區溢出問題,snprintf試圖通過增加一個參數來解決這個問題。

  格式化的輸出是由一個%為開始的字元,後續可能跟着最多四中标志,标志如下

APUE讀書筆記(7) 标準IO庫(下)

  其中flags的可能值如下:

APUE讀書筆記(7) 标準IO庫(下)

  fldwidth說明了最小字段寬度,如果轉換後參數字元數小于寬度,會用空格補充。字元寬度是一個非負的十進制整數,或者是

  precision說明轉換後最少的輸出位數或者是浮點數小數點後的數字個數或者是字元串轉換後的最大位元組數。

  lenmodifier說明參數長度,可能的值如下:

APUE讀書筆記(7) 标準IO庫(下)

  convtype是控制如何解釋參數的,對應關系如下:

APUE讀書筆記(7) 标準IO庫(下)