logo

scanf() en fscanf() in C

In C-taal, scanf() functie wordt gebruikt om geformatteerde invoer van stdin te lezen. Het retourneert het gehele aantal tekens dat erin is geschreven, anders retourneert het een negatieve waarde.

Syntaxis:



int scanf(const char *characters_set)>

Tijdcomplexiteit: Op)

Hulpruimte: O(n) waarbij n de invoerlengte is.

Velen van ons kennen het traditionele gebruik van scanf. Welnu, hier zijn enkele van de minder bekende feiten



Python converteert bytes naar string

Hoe kunnen we slechts een deel van de invoer lezen die we nodig hebben?
Beschouw bijvoorbeeld een invoerstroom die alleen tekens bevat, gevolgd door een geheel getal of een float. En we hoeven alleen dat gehele getal of float te scannen.

Voorbeeld:

  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>


Stel nu dat we niet weten wat de voorgaande tekens zijn, maar we weten zeker dat de laatste waarde een geheel getal is. Hoe kunnen we de laatste waarde als geheel getal scannen?



De onderstaande oplossing werkt alleen als de invoertekenreeks geen spaties bevat. Bijvoorbeeld,

Invoer

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

Uitvoer

Input Value read : 25>

Uitleg : De %*s in scanf wordt gebruikt om indien nodig invoer te negeren. In dit geval negeert het de invoer tot de volgende spatie of nieuwe regel. Op dezelfde manier, als u %*d schrijft, worden gehele getallen genegeerd tot de volgende spatie of nieuwe regel.

Algemeen gebruik van scanf():

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

Invoer

snaar gesplitste bash
2>

Uitvoer

a = 2>

Het bovenstaande feit lijkt op het eerste gezicht misschien geen bruikbare truc. Laten we, om het gebruik ervan te begrijpen, eerst fscanf() bekijken.

fscanf-functie in C

Ben je de onhandige syntaxis bij het lezen van bestanden beu? Nou, fscanf komt te hulp. Deze functie wordt gebruikt om de geformatteerde invoer van de gegeven stream in de C-taal te lezen.

Syntaxis:

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

fscanf leest uit een bestand waarnaar wordt verwezen door de FILE-aanwijzer (ptr), in plaats van uit de invoerstroom.

Winstwaarde: Het retourneert nul of EOF als dit niet lukt. Anders wordt het aantal succesvol toegewezen items geretourneerd.

Tijdcomplexiteit: Op)

Hulpruimte: O(n) waarbij n de lengte van de invoer is.

Voorbeeld 1: Beschouw het volgende tekstbestand abc.txt

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

Nu willen we alleen het stadsveld van het bovenstaande tekstbestand lezen en alle andere velden negeren. Een combinatie van fscanf en de hierboven genoemde truc doet dit met gemak

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

Uitvoer

CITY hyderabad delhi bangalore>

Voorbeeld 2: Beschouw het volgende binaire bestand program.bin

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

Om alle waarden van n1, n2 en n3 van de bak te lezen, gebruiken we fscanf()

Hoe te converteren van int naar string in Java
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>

Uitvoer

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

Laten we de verschillen in tabelvorm bekijken -:

scanf() fscanf()
1. Het wordt gebruikt om standaardinvoer te lezen.Deze functie wordt gebruikt om invoer uit een bestand te lezen
2.

De syntaxis ervan is -:

scanf(const char *formaat, …)

De syntaxis ervan is -:

fscanf(BESTAND *stream, const char *format, …)

3. Het vereist formaatspecificaties om invoer van een bepaald type te ontvangen.Het leest de stream in de vorm van byte
4.

Er zijn drie parameters nodig: -:

Witruimteteken, niet-witruimteteken, formaatspecificaties

Het wordt gedefinieerd in headerbestand #include