logo

scanf() і fscanf() у C

У мові C, scanf() функція використовується для читання форматованого введення зі стандартного вводу. Він повертає всю кількість символів, записаних у ньому, інакше повертає від’ємне значення.

Синтаксис:



int scanf(const char *characters_set)>

Часова складність: O(n)

Допоміжний простір: O(n), де n – довжина вхідних даних.

Багато з нас знають традиційне використання scanf. Що ж, ось деякі з маловідомих фактів



Шрея Гошал

Як прочитати лише ту частину введення, яка нам потрібна?
Наприклад, розглянемо деякий вхідний потік, який містить лише символи, за якими йде ціле число або число з плаваючою точкою. І нам потрібно сканувати лише це ціле чи число з плаваючою точкою.

приклад:

  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>

Пояснення : %*s у scanf використовується для ігнорування деяких введених даних за потреби. У цьому випадку він ігнорує введення до наступного пробілу або нового рядка. Подібним чином, якщо ви напишете %*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().

Функція fscanf у C

Втомилися від незграбного синтаксису для читання з файлів? добре, fscanf приходить на допомогу. Ця функція використовується для читання відформатованого введення з заданого потоку мовою C.

Синтаксис:

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

fscanf читає з файлу, на який вказує покажчик FILE (ptr), замість читання з вхідного потоку.

Повернене значення: У разі невдачі повертає нуль або EOF. В іншому випадку він повертає кількість успішно призначених елементів.

Часова складність: O(n)

Допоміжний простір: O(n), де n – довжина вхідних даних.

приклад 1: Розглянемо наступний текстовий файл abc.txt

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

Тепер ми хочемо прочитати лише поле міста з текстового файлу вище, ігноруючи всі інші поля. Поєднання 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(ФАЙЛ *потік, const char *формат, …)

3. Він вимагає специфікаторів формату, щоб приймати вхідні дані певного типу.Він читає потік у вигляді байта
4.

Для цього потрібні три параметри:

Пробільний символ , непробільний символ, специфікатори формату

як центрувати зображення на css
Він визначений у файлі заголовків #include