logo

C の scanf() と fscanf()

C言語では、 scanf() 関数は、フォーマットされた入力を標準入力から読み取るために使用されます。それ以外の場合は、書き込まれた文字の整数を返し、負の値を返します。

構文:



int scanf(const char *characters_set)>

時間計算量: の上)

補助スペース: O(n) ここで、n は入力の長さです。

私たちの多くは、scanf の伝統的な使い方を知っています。さて、あまり知られていない事実をいくつかご紹介します



文字列Javaを比較する

必要な入力の一部だけを読み取るにはどうすればよいでしょうか?
たとえば、文字とそれに続く整数または浮動小数点数のみを含む入力ストリームを考えてみましょう。そして、その整数または浮動小数点のみをスキャンする必要があります。

例:

  Input  : 'this is the value 100',    Output  : value read is 100   Input   : 'this is the value 21.2',    Output   : value read is 21.2>
C
// C program to demonstrate that // we can ignore some string // in scanf() #include  int main() {  int a;  scanf('This is the value %d', &a);  printf('Input value read : a = %d', a);  return 0; } // Input : This is the value 100>


ここで、先行する文字が何であるかはわかりませんが、最後の値が整数であることは確かにわかっていると仮定します。最後の値を整数としてスキャンするにはどうすればよいでしょうか?



以下の解決策は、入力文字列にスペースが含まれていない場合にのみ機能します。例えば、

入力

'blablabla 25'>
C
// C program to demonstrate use of *s #include  int main() {  int a;  scanf('%*s %d', &a);  printf('Input value read : a=%d', a);  return 0; }>

出力

Input Value read : 25>

説明 : scanf の %*s は、必要に応じて一部の入力を無視するために使用されます。この場合、次のスペースまたは改行まで入力は無視されます。同様に、%*d と記述すると、次のスペースまたは改行まで整数は無視されます。

scanf( ) の一般的な使用法:

C
// C program to demonstrate general use of scanf() #include  int main() {  int a;  scanf('%d', &a);  printf('a = %d', a);  return 0; }>

入力

2>

出力

a = 2>

上記の事実は、一見すると役に立つトリックのように思えないかもしれません。その使用法を理解するために、まず fscanf() を見てみましょう。

C の fscanf 関数

ファイルから読み取るためのぎこちない構文にうんざりしていませんか? fscanf が役に立ちます。この関数は、C 言語の指定されたストリームからフォーマットされた入力を読み取るために使用されます。

Java 配列への追加

構文:

int fscanf(FILE *ptr, const char *format, ...)>

fscanf は、入力ストリームから読み取るのではなく、FILE ポインター (ptr) が指すファイルから読み取ります。

戻り値: 失敗した場合は、ゼロまたは EOF を返します。それ以外の場合は、正常に割り当てられた項目の数を返します。

時間計算量: の上)

補助スペース: O(n) ここで、n は入力の長さです。

例 1: 次のテキスト ファイル abc.txt について考えてみましょう。

NAME AGE CITY abc 12 hyderabad bef 25 delhi cce 65 bangalore>

ここで、他のすべてのフィールドを無視して、上記のテキスト ファイルの city フィールドのみを読み取りたいとします。 fscanf と上記のトリックを組み合わせると、これを簡単に実行できます。

C
// C Program to demonstrate fscanf #include  // Driver Code int main() {  FILE* ptr = fopen('abc.txt', 'r');  if (ptr == NULL) {  printf('no such file.');  return 0;  }  /* Assuming that abc.txt has content in below  format  NAME AGE CITY  abc 12 hyderabad  bef 25 delhi  cce 65 bangalore */  char buf[100];  while (fscanf(ptr, '%*s %*s %s ', buf) == 1)  printf('%s
', buf);  return 0; }>

出力

CITY hyderabad delhi bangalore>

例 2: 次のバイナリ ファイル、program.bin について考えてみましょう。

n1 n2 n3 1 5 6 2 10 11 3 15 16 4 20 21>

ビンの n1、n2、n3 のすべての値を読み取るには、 fscanf() を使用します。

C
#include  #include  struct threeNum{  int n1, n2, n3; }; int main(){  int n;  struct threeNum num;  FILE *fptr;  if ((fptr = fopen('program.bin','rb')) == NULL){  printf('Error! opening file');  // Program exits if the file pointer returns NULL.  exit(1);  }  for(n = 1; n < 5; ++n){  fread(&num, sizeof(struct threeNum), 1, fptr);  printf('n1: %d	n2: %d	n3: %d', num.n1, num.n2, num.n3);  }  fclose(fptr);  return 0; } //Code submitted by Susobhan Akhuli>

出力

n1: 1 n2: 5 n3: 6 n1: 2 n2: 10 n3: 11 n1: 3 n2: 15 n3: 16 n1: 4 n2: 20 n3: 21>

違いを表形式で見てみましょう -:

scanf() fscanf()
1. 標準入力を読み取るために使用されます。この関数はファイルから入力を読み取るために使用されます
2.

その構文は次のとおりです。

scanf(const char *format, …)

その構文は次のとおりです。

fscanf(FILE *ストリーム, const char *フォーマット, …)

HTMLからjs関数を呼び出す
3. 特定の型の入力を受け取るには、形式指定子が必要です。ストリームをバイト形式で読み取ります
4.

次の 3 つのパラメータを取ります。

空白文字、空白以外の文字、書式指定子

ヘッダーファイル #include で定義されます