本文歸納整理了常用的標準IO常見的函式介面及其用法,以供讀者查閱
目錄
- 開啟檔案
- fopen
- 關閉檔案
- fclose
- 資料讀取
- 字元讀取:fgetc、getc、getchar
- 按行讀取:fgets、gets
- 按塊讀取:fread
- 寫入檔案
- 字元寫入:fputc、putc、putchar
- 按行寫入:fputs、puts
- 按塊寫入:fwrite
- 檔案位置(游標位置)
- 設定位移:fseek
- 獲取位移:ftell
- 格式訪問
- 向指定檔案中輸出格式化字串:fprintf
- 向指定緩衝區中輸出格式化的字串:sprintf
- 檔案錯誤處理
- 判斷讀取是否到達檔案末尾:feof
- 判斷檔案是否讀(或寫)異常:ferror
開啟檔案
fopen
注:
- 使用fopen開啟檔案時,游標會位於檔案的開頭,當需要對檔案進展二進位制開啟的時候,可以追加選項“b”。
- FILE型別其實是一個結構體資料型別,它包含了標準 I/O 庫函式為管理檔案所需要的所有資訊,比如包括用於實際I/O 的檔案描述符、指向檔案緩衝區的指標、緩衝區的長度、當前緩衝區中的位元組數以及出錯標誌等。標頭檔案stdio.h中有關於FILE型別的相關描述,FILE結構體型別中有一個成員是FILE型別的指標變數chain,該指標可以指向下一個被開啟檔案的檔案資訊區,也就是可以把FILE型別當做資料結構中的連結串列的結點,結點中除了可以儲存資料域之外,還可以利用指標域儲存下一個結點的地址。
- 簡單理解:使用者可以在一個程式中利用fopen函式開啟多個檔案,每次開啟一個檔案,核心就會從堆記憶體中申請一塊FILE結構體大小的空間用來儲存檔案的所有資訊,然後按照檔案開啟的順序把每個開啟的檔案的結構體形成一條連結串列,然後使用連結串列頭進行管理。
- 注意:開啟檔案的目的無非就是對檔案進行讀寫操作,所以每次當程式執行的時候已經有三個檔案流被開啟,分別是標準輸入stdin、標準輸出stdout、標準出錯stderr,這三者在stdio.h中也是FILE指標。
關閉檔案
fclose
注:
- fclose函式中使用了free,所以不能重複使用fclose對同一個檔案關閉多次。
資料讀取
字元讀取:fgetc、getc、getchar
注:
- 函式getc()的作用等效於fgetc()函式,只不過getc()函式的實現是利用宏定義而已。
- 當使用fgetc\getc函式從檔案中讀取一個字元後,檔案的游標(或稱為檔案位置指標)會自動移動到下一個字元的位置。
- 當getc的引數為stdin(標準輸入)時,getc等效於getchar
按行讀取:fgets、gets
注:
- 當使用fgets函式從檔案中讀取一行資料時,檔案的游標(或稱為檔案位置指標)會自動移動到下一行需要讀取的資料的起始位置。
- fgets當讀取到n-1個字元、或者已經讀取到檔案末尾(EOF)、或者讀取到換行符’\n’時,函式呼叫停止。
- fgets 會將換行符(如果存在)也讀取到緩衝區中,同時它會在字串的末尾新增一個空字元(\0)以標記字串的結束。
- gets函式是一個不推薦使用的函式,因為它不檢查目標緩衝區的大小,這可能導致緩衝區溢位和安全問題(例如,緩衝區溢位攻擊)。然而,就gets函式本身的行為而言,它會讀取一行輸入,包括換行符(如果存在的話),並將其儲存在提供的字元陣列中,但是換行符不會被儲存在陣列中。
按塊讀取:fread
注:
- 可以使用feof和ferror這兩個函式來區分讀取錯誤或者到達檔案末尾的情況
寫入檔案
字元寫入:fputc、putc、putchar
注:
- 當使用fputc函式向檔案中寫入一個字元時,檔案的游標(或稱為檔案位置指標)會自動移動到下一個字元的位置。
按行寫入:fputs、puts
注:
- 當使用fputs函式寫入一個字串到檔案時,檔案的游標(或稱為檔案位置指標)不會自動移到下一行的起始位置。fputs只是簡單地將字串寫入到當前檔案游標所在的位置,並且游標會移動到字串的末尾
- 如果希望寫入字串後游標位於新的一行的起始位置,需要在字串的末尾新增一個換行符(\n)。這樣,當fputs寫入字串和換行符後,下一次寫入操作將開始於新的一行的起始位置。
按塊寫入:fwrite
注:
- 當使用fwrite函式向檔案寫入資料時,檔案的游標(或稱為檔案位置指標)會移動到寫入資料的末尾。具體來說,fwrite會將提供的資料塊寫入到檔案的當前位置,並將游標移動到寫入資料的末尾。
檔案位置(游標位置)
設定位移:fseek
獲取位移:ftell
注:
- 如需獲得整個檔案的偏移量,需要用fseek函式將檔案的游標設定為末尾。