scanf() a fscanf() v C

V jazyce C, scanf() funkce se používá ke čtení formátovaného vstupu ze stdin. Vrátí celý počet znaků zapsaných v něm jinak, vrátí zápornou hodnotu.

Syntax:

int scanf(const char *characters_set) 

Časová náročnost: Na)

Pomocný prostor: O(n) kde n je délka vstupu.

Mnoho z nás zná tradiční použití scanf. No, tady jsou některé z méně známých faktů

Jak číst pouze část vstupu, který potřebujeme?
Vezměme si například nějaký vstupní proud, který obsahuje pouze znaky následované celým číslem nebo plovoucí čárkou. A my potřebujeme skenovat pouze toto celé číslo nebo plovoucí číslo.

Příklad:

  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 


Nyní předpokládejme, že nevíme, co jsou předchozí znaky, ale určitě víme, že poslední hodnota je celé číslo. Jak můžeme naskenovat poslední hodnotu jako celé číslo?

Níže uvedené řešení funguje pouze v případě, že vstupní řetězec neobsahuje mezery. Například,

Vstup

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

Výstup

Input Value read : 25 

Vysvětlení : %*s v scanf se používá k ignorování některých vstupů podle potřeby. V tomto případě ignoruje vstup až do další mezery nebo nového řádku. Podobně, pokud napíšete %*d, bude ignorovat celá čísla až do další mezery nebo nového řádku.

Obecné použití scanf():

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

Vstup

2 

Výstup

a = 2 

Výše uvedený fakt se na první pohled nemusí zdát jako užitečný trik. Abychom porozuměli jeho použití, podívejme se nejprve na fscanf().

Funkce fscanf v C

Už vás nebaví všechna ta nemotorná syntaxe ke čtení ze souborů? fscanf přichází na pomoc. Tato funkce slouží ke čtení formátovaného vstupu z daného streamu v jazyce C.

Syntax:

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

fscanf čte ze souboru, na který ukazuje ukazatel FILE (ptr), namísto čtení ze vstupního proudu.

Návratová hodnota: Vrátí nulu nebo EOF, pokud není úspěšný. V opačném případě vrátí počet úspěšně přiřazených položek.

Časová náročnost: Na)

Pomocný prostor: O(n) kde n je délka vstupu.

Příklad 1: Zvažte následující textový soubor abc.txt

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

Nyní chceme číst pouze pole města výše uvedeného textového souboru a ignorovat všechna ostatní pole. Kombinace fscanf a výše uvedeného triku to dělá snadno

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

Výstup

CITY hyderabad delhi bangalore 

Příklad 2: Zvažte následující binární soubor program.bin

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

Ke čtení všech hodnot n1, n2 a n3 přihrádky používáme 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 

Výstup

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

Podívejme se na rozdíly v tabulkové formě -:

scanf() fscanf()
1. Používá se ke čtení standardního vstupu. Tato funkce se používá ke čtení vstupu ze souboru
2.

Jeho syntaxe je -:

scanf(const char *formát, …)

Jeho syntaxe je -:

fscanf(FILE *stream, const char *formát, …)

3. Vyžaduje, aby specifikátory formátu převzaly vstup určitého typu. Přečte proud ve formě bajtu
4.

Vyžaduje tři parametry, které jsou:

Znak mezery , Znak bez mezer, Specifikátory formátu

Je definován v záhlaví souboru #include