Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4283

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Глава 30. Функции для работы с файлами <stdio.h> 

361 

 

ширина

  задает  максимальное  количество  символов,  вводимых 

по данной спецификации; 

 

модификатор

 уточняет тип аргумента; 

 

тип

 задает тип аргумента. 

Для ввода массива символов используется следующий формат: 

  %[*][ширина][l]c 

где: 

 

ширина

  задает  количество  символов,  которые  должны  быть 

введены  из  потока;  если 

ширина

  опущена,  то  вводится  один 

символ; 

 

l

 указывает, что вводится массив широких (wide) символов; 

 

c

 указывает, что вводится массив символов. 

Для  ввода  массива  символов  также  используется  следующий 
формат: 

  %[*][ширина][l]s 

где: 

 

ширина

  задает  количество  символов,  которые  должны  быть 

введены  из  потока;  если 

ширина

  опущена,  то  вводится  строка 

символов до первого пробельного символа; 

 

l

 указывает, что вводится массив широких (wide) символов; 

 

s

 указывает, что вводится массив символов. 

В этом случае по окончании ввода символов функция 

fscanf

  за-

писывает в массив пустой символ. 
Для  ввода  целого  числа  со  знаком  используется  следующий  
формат: 

  %[*][ширина][h|l]{d|i} 

где: 

 

h

 

обозначает модификатор типа 

short

 

l

 обозначает модификатор типа 

long

 

d

  обозначает  число  типа 

int

,  которое  записано  в  десятичной 

системе счисления; 


background image

Часть III. Стандартная библиотека языка программирования C 

362 

 

i

 обозначает число типа 

int

, которое записано в восьмеричной 

или шестнадцатеричной системе счисления. 

Правила  записи  целых  чисел,  используя  восьмеричную  и  шест- 
надцатеричную системы счисления, совпадают с правилами обо-
значения числовых констант в этих же системах счисления. 
Для ввода целого числа без знака используется следующий фор-
мат ввода: 

  %[*][ширина][h|l]{u|o|x|X} 

где: 

 

h

 

обозначает модификатор типа 

short

 

l

 обозначает модификатор типа данных 

long

 

u

 обозначает число типа 

unsigned

, которое записано в десятич-

ной системе счисления; 

 

o

 обозначает число типа 

unsigned

, которое записано в восьме-

ричной системе счисления; 

 

x

  и

  X

  обозначают  число  типа 

unsigned

,  которое  записано  в  

шестнадцатеричной системе счисления. 

Для  ввода  числа  с  плавающей  точкой  используется  следующий 
формат: 

  %[*][ширина][l|L]{f|e|E|g|G} 

где: 

 

l

 обозначает, что вводится число с плавающей точкой в пере-

менную типа 

double

 

L

 обозначает, что вводится число с плавающей точкой в пере-

менную типа 

long double

 

f

e

E

g

 или 

G

 обозначает число с плавающей точкой, которое 

вводится  в  переменную  типа 

float

.  Это  число  может  содер-

жать как точку, так и экспоненту, которая должна начинаться 
с буквы 

e

 или 

E

Для ввода указателя используется следующий формат: 

  %[*][ширина]p 

где 

p

 обозначает, что вводится указатель. 


background image

Глава 30. Функции для работы с файлами <stdio.h> 

363 

Для  определения  количества  символов,  которые  были  успешно 
прочитаны из потока ввода, используется следующий формат: 

  %[l]n 

где: 

 

l

 обозначает модификатор типа 

long

 

n

  указывает,  что  аргумент  должен  быть  адресом  на  указатель 

типа 

int*

 или 

long int*

В  этом  случае  в  переменную,  на  которую  указывает  аргумент, 
функция 

fscanf

  запишет  количество  успешно  введенных  симво-

лов. 
В  листинге  30.8  приведены  примеры  использования  функции 

fscanf

Листинг 30.8. Форматированный ввод 

#include <stdio.h> 
 
int main() 

  FILE *out, *in; 
  char  c; 
  char s[10]; 
  int  n; 
  unsigned m; 
  double  d = 0.0; 
 
  char str[] = "a abcd -10 0x123 12.3E-1"; 
 
  /* создаем текстовый файл */ 
  out = fopen("text.txt", "w"); 
  fputs(str, out);  /* пишем строку в файл */ 
  fclose(out); 
 
  /* открываем поток для чтения в текстовом режиме */ 
  in = fopen("text.txt", "r"); 
  /* читаем из входного потока */ 
  fscanf(in, "%c", &c); 


background image

Часть III. Стандартная библиотека языка программирования C 

364 

  printf("%c\n", c); 
  fscanf(in, "%s", s); 
  printf("%s\n", s); 
 
  fscanf(in, "%d", &n); 
  printf("%d\n", n); 
  fscanf(in, "%x", &m); 
  printf("%#x\n", m); 
 
  fscanf(in, "%lf", &d); 
  printf("%f\n", d); 
 
  fclose(in); 
 
  return 0; 

30.13. Форматирование  

и сканирование строк 

Существуют  варианты  функций 

fprintf

  и 

fscanf

,  которые  пред-

назначены  для  форматирования  строк  и  называются  соответст-
венно 

sprintf

 и 

sscanf

Для форматирования строки предназначена функция 

sprintf

, ко-

торая имеет следующий прототип: 

  int sprintf(char *buffer, const char *format, ...); 

Эта  функция  форматирует  строку  в  соответствии  с  форматом, 
который задан параметром 

format

, и записывает полученный ре-

зультат в символьный массив 

buffer

. Возвращает функция коли-

чество  символов,  записанных  в  символьный  массив 

buffer

,  ис-

ключая завершающий нулевой байт. 
В листинге 30.9 приведен пример форматирования строки. 

Листинг 30.9. Форматирование строки 

#include <stdio.h> 
int main() 


background image

Глава 30. Функции для работы с файлами <stdio.h> 

365 


  char buffer[80]; 
 
  char str[] = "c:%c d:%d g:%g s:%s"; 
  char c = 'c'; 
  int n = 10; 
  double d = 1.2; 
  char s[] = "The string"; 
 
  sprintf(buffer, str, c, n, d, s); 
  printf("%s\n", buffer);  /* c:c n:10 d:1.2 s:The string */ 
 
  return 0; 

Для сканирования строки предназначена функция 

sscanf

, которая 

имеет следующий прототип: 

  int sscanf(const char *str, const char *format, ...); 

Эта функция читает данные из строки, заданной параметром 

str

в  соответствии  с  форматной  строкой,  заданной  параметром 

format

. В случае удачи функция возвращает количество отскани-

рованных  полей.  В  случае  ошибки  или  в  случае,  если  по  дости-
жении конца строки 

str

 не было отсканировано ни одного поля, 

функция возвращает значение 

EOF

В листинге 30.10 приведен пример сканирования строки. 

Листинг 30.10. Сканирование строки 

#include <stdio.h> 
int main() 

  char str[] = "c 10 1.2 String No input"; 
  char c; 
  int n; 
  double d; 
  char s[80]; 
 
  sscanf(str, "%c %d %lf %s", &c, &n, &d, s); 


Смотрите также файлы