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
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.2C
// 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:
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 | Il est défini dans le fichier d'en-tête #include |