logo

scanf() et fscanf() en C

En langage C, scanf() La fonction est utilisée pour lire les entrées formatées à partir de stdin. Il renvoie le nombre entier de caractères qui y sont écrits, sinon renvoie une valeur négative.

Syntaxe:



int scanf(const char *characters_set)>

Complexité temporelle : Sur)

Espace auxiliaire : O(n) où n est la longueur de l'entrée.

Beaucoup d’entre nous connaissent les utilisations traditionnelles de scanf. Eh bien, voici quelques-uns des faits les moins connus



CSS centrant une image

Comment lire seulement une partie de l’entrée dont nous avons besoin ?
Par exemple, considérons un flux d'entrée contenant uniquement des caractères suivis d'un entier ou d'un flottant. Et nous devons analyser uniquement cet entier ou ce flottant.

Exemple:

  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>


Supposons maintenant que nous ne savons pas quels sont les caractères précédents mais que nous savons sûrement que la dernière valeur est un entier. Comment pouvons-nous scanner la dernière valeur sous forme d’entier ?



La solution ci-dessous ne fonctionne que si la chaîne d'entrée ne contient aucun espace. Par exemple,

Saisir

'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; }>

Sortir

Input Value read : 25>

Explication : Le %*s dans scanf est utilisé pour ignorer certaines entrées si nécessaire. Dans ce cas, il ignore l'entrée jusqu'au prochain espace ou nouvelle ligne. De même, si vous écrivez %*d, il ignorera les entiers jusqu'au prochain espace ou nouvelle ligne.

Utilisation générale de scanf( ) :

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

Saisir

2>

Sortir

a = 2>

Le fait ci-dessus peut ne pas sembler être une astuce utile à première vue. Afin de comprendre son utilisation, voyons d’abord fscanf().

Fonction fscanf en C

Fatigué de toute la syntaxe maladroite à lire à partir de fichiers ? eh bien, fscanf vient à la rescousse. Cette fonction est utilisée pour lire l'entrée formatée du flux donné dans le langage C.

Syntaxe:

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

fscanf lit à partir d'un fichier pointé par le pointeur FILE (ptr), au lieu de lire à partir du flux d'entrée.

Valeur de retour : Il renvoie zéro ou EOF en cas d'échec. Sinon, il renvoie le nombre d'éléments attribués avec succès.

Complexité temporelle : Sur)

Espace auxiliaire : O(n) où n est la longueur de l'entrée.

Exemple 1: Considérez le fichier texte suivant abc.txt

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

Maintenant, nous voulons lire uniquement le champ ville du fichier texte ci-dessus, en ignorant tous les autres champs. Une combinaison de fscanf et de l'astuce mentionnée ci-dessus permet de le faire facilement

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; }>

Sortir

CITY hyderabad delhi bangalore>

Exemple 2 : Considérez le fichier binaire suivant program.bin

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

Pour lire toutes les valeurs de n1, n2 et n3 du bin, nous utilisons 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>

Sortir

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

Voyons les différences sous forme de tableau - :

scanf() fscanf()
1. Il est utilisé pour lire l’entrée standard.Cette fonction est utilisée pour lire l'entrée d'un fichier
2.

Sa syntaxe est - :

scanf(const char *format, …)

Sa syntaxe est - :

fscanf(FILE *flux, const char *format, …)

3. Cela nécessite que les spécificateurs de format acceptent une entrée d'un type particulier.Il lit le flux sous forme d'octet
4.

Il faut trois paramètres qui sont - :

Caractère d'espacement, Caractère autre qu'un espace, Spécificateurs de format

comment fonctionne un ordinateur
Il est défini dans le fichier d'en-tête #include