函式
<cstdio>

fscanf

int fscanf ( FILE * stream, const char * format, ... );
從流中讀取格式化資料
stream讀取資料,並根據format引數將資料儲存到其他引數指向的位置。

附加引數應該指向已分配的物件,其型別由 format 字串中相應的格式說明符指定。

引數

stream
指向一個FILE物件的指標,該物件標識要從中讀取資料的輸入流。
format
C語言字串,包含一系列字元,這些字元控制從流中提取的字元如何被處理
  • 空白字元:函式將讀取並忽略遇到的任何空白字元,直到遇到下一個非空白字元為止(空白字元包括空格、換行符和製表符——參見isspace)。格式字串中的單個空白字元會匹配流中任意數量的空白字元(包括零個)並忽略它們。
  • 非空白字元,格式說明符(%)除外:任何不是空白字元(空格、換行符或製表符)或格式說明符(以%字元開頭)的字元都會導致函式讀取流中的下一個字元,將其與此非空白字元進行比較,如果匹配,則將其丟棄,函式繼續處理format中的下一個字元。如果字元不匹配,函式將失敗,返回並使流中剩餘的字元保持未讀取狀態。
  • 格式說明符:以初始百分號(%)開頭的序列表示一個格式說明符,用於指定要從stream中提取的資料的型別和格式,以及將其儲存在其他引數指向的位置。

格式說明符fscanf遵循以下原型

%[*][寬度][長度]說明符

其中末尾的說明符字元是最重要的組成部分,因為它定義了提取哪些字元、它們的解釋以及其對應引數的型別。
說明符描述提取的字元
i, u整數任意數量的數字,可選地前面有符號(+-).
十進位制數字,預設為(0-9),但0字首引入八進位制數字(0-7),以及0x 十六進位制數字 (0-f).
d十進位制整數任意數量的十進位制數字0-9),可選地前面有符號(+-).
o八進位制整數任意數量的八進位制數字(0-7),可選地前面有符號(+-).
x十六進位制整數任意數量的十六進位制數字0-9, a-f, A-F),可選地前面有0x或 0X,並可選地前面有符號(+-).
f, e, g浮點數一系列十進位制數字,可選地包含小數點,可選地前面有符號(+-)並可選地後面跟著eE字元和十進位制整數(或strtod支援的其他序列)。
符合C99標準的實現也支援十六進位制浮點數格式,當其前面有0x0X時。
a
c字元下一個字元。如果指定了除1以外的寬度,則函式讀取寬度個字元並將它們儲存在作為引數傳遞的陣列的連續位置中。末尾不會附加空字元。
s字串任意數量的非空白字元,在遇到第一個空白字元時停止。一個終止的空字元會自動新增到儲存序列的末尾。
p指標地址表示指標的字元序列。具體的格式取決於系統和庫實現,但它與fprintf中格式化%p的格式相同。
[字元]掃描集括號內指定的任意數量的字元。
破折號(-),如果不是第一個字元,在某些庫實現中可能會產生不可移植的行為。
[^字元]否定掃描集任意數量的字元,其中不包括括號內指定的任何字元
n計數不消耗輸入。
stream讀取的字元數儲存在指向的位置。
%%A%後跟另一個%匹配單個%.
除了n之外,任何說明符至少應消耗一個字元。否則,匹配失敗,掃描將在此處結束。

格式說明符還可以包含子說明符:星號*)、寬度長度(按此順序),它們是可選的,並遵循這些規範
子說明符描述
*可選的起始星號表示資料將從流中讀取但被忽略(即不儲存在引數指向的位置)。
寬度指定當前讀取操作中要讀取的最大字元數(可選)。
長度之一hh, h, l, ll, j, z, t, L(可選)。
這會改變相應引數指向的儲存的預期型別(見下文)。

這是一個圖表,顯示了儲存輸入(帶或不帶長度子說明符)的相應引數所期望的型別。
說明符
長度d iu o xf e g ac s [] [^]pn
(無)int*unsigned int*float*char*void**int*
hhsigned char*unsigned char*signed char*
hshort int*unsigned short int*short int*
llong int*unsigned long int*double*wchar_t*long int*
lllong long int*unsigned long long int*long long int*
jintmax_t*uintmax_t*intmax_t*
zsize_t*size_t*size_t*
tptrdiff_t*ptrdiff_t*ptrdiff_t*
Llong double*
注意:黃色行表示C99引入的說明符和子說明符。
... (附加引數)
根據 format 字串,該函式可能需要一系列附加引數,每個引數都包含一個指向已分配儲存空間的指標,其中提取的字元的解釋將以適當的型別儲存。
這些引數的數量至少應與格式說明符儲存的值的數量相同。多餘的引數會被函式忽略。
這些引數預計是指標:要將對常規變數的操作結果儲存到其中,其名稱應加上引用運算子fscanf)(請參閱示例)。&如果發生讀取錯誤或在讀取過程中到達了檔案末尾,則會設定相應的指示符(feofferror)。如果任何一個在成功讀取任何資料之前發生,則返回EOF

返回值

成功時,函式返回成功填充的引數列表項的數量。由於匹配失敗、讀取錯誤或到達檔案結尾,該計數可能與預期的項數相符,也可能更少(甚至為零)。

EILSEQ

如果在解釋寬字元時發生編碼錯誤,函式會設定 errno此示例程式碼建立一個名為.

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* fscanf example */
#include <stdio.h>

int main ()
{
  char str [80];
  float f;
  FILE * pFile;

  pFile = fopen ("myfile.txt","w+");
  fprintf (pFile, "%f %s", 3.1416, "PI");
  rewind (pFile);
  fscanf (pFile, "%f", &f);
  fscanf (pFile, "%s", str);
  fclose (pFile);
  printf ("I have read: %f and %s \n",f,str);
  return 0;
}

myfile.txt的檔案,並向其中寫入一個浮點數和一個字串。然後,流被倒回,並使用讀取兩個值。最後,它產生一個類似於fscanf的輸出。
I have read: 3.141600 and PI


相容性

特定的庫實現可能支援額外的說明符和子說明符。
此處列出的說明符和子說明符受最新的C和C++標準(均於2011年釋出)支援,但黃色行中的說明符和子說明符是由C99引入的(僅在C++11及以後版本中被C++實現要求),並且可能不被符合舊標準的庫支援。

另見