Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Давыдов В.Г. - Программирование и основы алгоритмизации - 2003

.pdf
Скачиваний:
839
Добавлен:
13.08.2013
Размер:
9.55 Mб
Скачать

void

convert

(

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

±nt

 

 

ch

)

 

 

//

Изображаемый

символ

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

printf(

"Символ

 

10

код

 

8

код

 

16

код

\п"

)

;

//

 

Непечатные

 

символы

 

имеют десятичные

коды

О..

31,

а

//

 

десятичный

 

код

символа

'

'

равен

32

 

 

 

 

±

f ( c h

< ' '

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

printf(

"Управляющий

 

(непечатный)

символ:

 

\п"

) ;

//

 

Обратите

внимание,

 

что

один

 

и

тот

же

символ

 

печатается

//

 

вначале

в

символьном

 

формате

%с,

а

затем

 

 

//

 

соответственно

 

в

форматах

 

десятичного

 

%d,

 

 

//

 

восьмеричного

и

16-ричного

 

%к чисел.

 

Число

//

 

форматов

и

количество

 

следующих

за

 

управляющей

//

 

строкой

аргументов

 

 

совпадают

 

 

 

 

 

 

print

f(

"%с

 

 

%d

 

 

 

 

\п",

 

 

 

 

 

ch,

 

 

ch,

 

 

 

ch,

 

 

 

ch

) ;

 

 

 

return;

}

Заметим, что данный пример, не только показывает структуру программы, но и иллюстрирует, как нужно оформлять программу, использовать комментарии и т.п.

Проанализируем этот пример и подведем некоторые итоги. Каждая Си-программа должна иметь одну и только одну главную функцию с именем main. С этой функции начинается исполнение программы. Другие функции могут быть вызваны из функции main или из какой-либо другой функции в процессе выполнения про­ граммы. Эти функции могут находиться в том же модуле (файле), что и функция main, или в других модулях.

Функция может иметь нудь или более аргументов. Аргументы являются переменными, которые используются для передачи дан­

ных

между функциями (main не имеет

аргументов, а

функция

convert имеет один аргумент - переменную

ch).

 

 

Каждая функция после своего заголовка содержит блок, кото­

рый

начинается с "{" и заканчивается " } " . Блок содержит

определе­

ния данных, за которыми следуют операторы функции. Определения данных создают переменные, которые будут использованы в функ­ ции. Операторы задают действия, которые должны быть выполнены над переменными.

Все элементы данных должны быть определены перед их ис­ пользованием. Определения данных всегда завершаются точкой с запятой. Операторы также завершаются точкой с запятой.

40

2.4. Простой ввод-вывод в языках Си/С++

Языки Си/С++ не содерэюат встроенных средств вводавывода. Для реализации ввода-вывода в составе системы програм­ мирования Си/С+-ь поставляется библиотека стандартных функций, содержащая наряду с другими функциями функции ввода-вывода. Функции ввода-вывода библиотеки позволяют читать данные из файлов на магнитных дисках и с устройств и писать данные в файлы и на устройства. Библиотека Си поддерживает три уровня вводавывода:

ввод-вывод потока;

ввод-вывод нижнего уровня;

ввод-вывод для консоли и порта.

Здесь мы рассмотрим только ввод-вывод потока.

2.4.1. Ввод-вывод потока

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

Ввод-вывод потока позволяет.

1.Открывать и закрывать потоки.

2.Читать и записывать символ.

3.Читать и записывать целые данные.

4.Читать и записывать строки.

5.Читать и записывать форматированные данные любого типа.

6.Анализировать ошибки ввода-вывода потока и достижение конца потока (конца файла).

Для использования функций ввода-вывода потока в программе необходимо директивой include включить в состав текста програм­ мы файл stdio.h:

^include <stdio.h>

Обработка данной директивы состоит в замене строки ди­ рективы содерэюимым текстового файла stdio.h. Этот файл содер­ жит объявления и определения функций ввода-вывода, а также оп­ ределения констант, типов и структур, используемых функциями ввода-вывода потока.

41

Открытие потока. Перед выполнением операций вводавывода для потока его нужно открыть. Для этой цели служит функ­ ция уЬрег7(^^, описание которой имеет вид:

^include

<stdlo.h>

//

Возвращает

указатель

на

открытый

FILE * fopen (

 

 

 

 

//

файл

 

 

 

 

const

char

*path.

//

Указатель

на

имя

открываемого

const

cha.i:

*type ) ;

//

файла

на

вид доступа

к файлу

//

Указатель

Функция открывает файл path в режиме доступа type. Сим­ вольная строка type задает вид доступа к файлу в соответствии с табл. 6. Функция/open возвращает указатель на открытый файл. Ну­ левой указатель (NULL) означает ошибку. Многочисленные приме­ ры открытия файлов с контролем ошибок приведены ниже.

 

Табл. 6. Виды доступа к файлу

Вид доступа type

Назначение

"г"

Открывается файл для чтения. Если файл не существует или не

 

может быть найден, то возникает ошибка

'V'

Открывается пустой файл для записи. Если файл уже

 

существует, то его содержимое будет уничтожено

"л"

Открывается файл для записи в конец (добавления). Если файл

 

не существует, то он сначала будет создан

•V+"

Открывается файл для чтения и для записи (файл должен

 

существовать, иначе - ошибка)

"w+"

Открывается пустой файл для чтения р для записи. Если файл

 

уже существует, то его содержимое будет уничтожено

"а+"

Открывается файл для чтения и для записи в конец

 

(добавления). Если файл не существует, то он сначала будет

 

создан

Закрытие потока. Для закрытия потока служит функция fclose(), которую следует вызвать сразу же после окончания работы с потоком:

ilnclude <stdio.h>

±nt

fclose(

 

/ /

Возвращает О при успехе

и EOF при

 

 

 

//

ошибке

 

 

 

FILE

stream

) ;

/ / Закрываемый

поток

 

 

Примеры закрытия файлов с контролем ошибок приведены

ниже.

 

 

 

 

 

 

Предопределенные

указатели потока.

В начале

выполнения

Си-программы автоматически открывается пять потоков:

42

стандартный ввод (предопределенный указатель

stdin);

стандартный вывод (предопределенный указатель

stdout);

стандартный вывод сообщений об ошибках (предопределенный

 

указатель stderr);

 

• стандартный дополнительный поток (предопределенный указа­

 

тель

stdaux);

stdprn).

стандартная печать (предопределенный указатель

 

По

умолчанию stdin соответствует клавиатуре терминала,

stdout и stderr - экрану терминала, stdaux - дополнительному порту и stdprn - печатающему устройству.

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

Функции чтения из потока и записи в поток. Функции чте­ ния из потока и записи в поток, имеющиеся в языке Си, перечисле­ ны в табл. 7.

Табл. 7. Функции чтения из потока и записи в поток

Объект

Чтение

Чтение из

Чтение

Запись в

Запись в

Запись в

 

операции

из stdin

любого

из стро­

stdout

любой

строку Си

 

 

потока

ки Си

 

поток

 

 

Серия бай­

 

fread

 

 

fwrite

 

 

тов

getc

fgetc

 

put

fputc

 

 

Символ

 

 

 

 

getchar

fgetchar

 

putchar

fputchar

 

 

Данное int

 

getw

 

ungetc

putw

 

 

 

 

 

 

 

Строка

gets

/gets

 

puts

/puts

 

 

Формат,

scan/

fscanf

sscanf

print/

/print/

sprint/

 

данные

 

 

 

vprintf

v/print/

vsprint/

1

На данном этапе среди функций, перечисленных в таблице,

рассмотрим лишь универсальные функции для

ввода scan/-/scan/

и

для вывода

printf-fprint/

 

 

 

 

 

2.4.2. Ввод с использованием функций scanf-fscanf

Вначале рассмотрим и проанализируем несколько примеров. Общей особенностью приведенных ниже программ-примеров явля­ ется их оформление в виде, предусматривающем возможность их выполнения на ЭВМ.

/*

Программа-пример

1 (начало) .

43

 

ввод

в

ЯЗЫКЕ

Си •

написать

фрагмент

 

Си-программы^

 

которая

из

файла

"exl

 

dat"

 

на

магнитном

диске

прочитает

указанные

 

ни-

же

 

значения:

 

1 г

 

 

//

OxFA

 

 

 

 

 

 

 

 

 

 

±пЬ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

а.

 

 

 

//

-22

 

 

 

 

 

 

 

 

 

 

 

float

 

 

 

12;

 

 

//

074

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f;

 

 

 

//

1.57

 

 

 

 

 

 

 

 

 

 

 

long

 

 

 

1;

 

 

 

//

-125874

 

 

 

 

 

 

 

 

 

 

char

 

 

 

ch.

 

20

//

'Z

'

 

Тхань"

 

 

 

 

 

 

 

 

 

 

 

 

 

str[

];//

"Нам

 

 

 

 

 

 

 

 

"exl.

Написать

вид

 

читаемых

данных

(вид

 

строк

в

файле

dat")

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-^/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

^Include

 

<stdlo.h>

 

 

//

Для

функций

 

ввода-вывода

 

 

int

main

(

void

)

 

 

 

//

Возвращает

О при

успехе

 

 

 

{

int

 

 

 

i, 11^

12;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

float

 

 

 

f;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

long

 

 

 

1;

 

str[

20

];

 

 

 

 

 

 

 

 

 

 

 

 

char

 

 

 

ch,

 

 

 

на

структуру

со

 

 

 

FILE

 

 

 

*f_ln;

 

//

Указатель

 

 

 

int

 

 

 

ret

code;

//

 

сведениями

 

о

файле

для

ввода

 

 

 

 

 

//

Возвращаемое

значение

для

fscanf

 

//

Открываем

файл

exl.dat

 

для

чтения

 

 

 

 

 

 

 

 

f_ln

- fopen(

 

"exl.dat",

"г"

)

;

 

 

 

 

 

 

 

 

 

if(

f__ln

-= NULL

)

//

Ошибка

открытия

файла

 

 

 

 

{

 

printf(

 

"\n

Файл

 

" )

;

 

 

 

 

exl.dat

 

для чтения

не

открыт.

 

 

 

return

1;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//

Читаем

данные

из

файла

 

exl.dat

 

 

 

 

 

 

 

 

 

retcode

 

=

fscanf(

 

f_ln,

f=^%f

l = %ld

ch^%c

str=%s%c%s",

 

 

 

 

"

1 = %х ll=%d

12=%о

;

 

if(

&1,

Sell,

&12,

&f, &1,

&ch,

str,

 

&str[3],

 

&str[4]

)

 

retcode

!=

9

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{

 

print

f

( "\n

Данные

в fscanf

прочитаны

с

ошибками."

) ;

 

 

 

 

 

 

return

2;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

return О;

}

//Конец примера 1

Вид

строк

исходных

данных в

файле

exl.dat:

 

 

l=OxFA 11=-22

 

12=074

f==1.57

1 = -125874

ch=z

 

 

str=HaM

Тхань

 

 

 

 

44

Как работает функция fscanf?

Вначале слева направо просматривается управляющая строка "...". Если очередным символом является символ "пробельной груп­ пы" (пробел или '\Г' или \п'), то в исходных данных (во входном по­ токе) пропускаются все подряд идущие символы пробельной груп­ пы, пока не встретится другой символ.

Если в управляющей строке встретится формат, который на­ чинается с символа "%", то из входного потока читается последова­ тельность символов до пробельного символа. Она преобразуется в кодовый формат в соответствии с типом формата и записывается по адресу, заданному в соответствующем аргументе (запись &/ означа­ ет адрес, по которому в оперативной памяти размещается перемен­ ная /). Если до пробельного символа раньше встретится символ, не допустимый в записи читаемого значения, то ввод по текущему формату остановится на этом символе. Символ управляющей стро­ ки, следующий за символом "%", указывает способ преобразования символов из входного потока в кодовый формат (табл. 8).

!!! Число форматов и число аргументов в функции/уса«/обя­ зательно должно быть одинаковым.

Если в управляющей строке встретился символ, отличный от символа пробельной группы и от символа "%", то функция fscanf считывает очередной символ из входного потока. При несоответст­ вии прочитанного символа символу, указанному в управляющей строке, функция/л'сал?/прерывает работу и конфликтный символ ос­ тается во входном потоке. В случае соответствия прочитанный сим­ вол пропускается и функция продолжает работу. Отмеченная осо­ бенность позволяет организовать так называемый "не слепой" ввод. Это означает, что во входном потоке (в файле исходных данных) с помощью лидирующих символов можно указать, к какой перемен­ ной относится вводимое значение (см. текст примера выше).

Рассмотрим еще один пример, являющийся логическим про­ должением предыдущего примера.

/*

Программа

--пример 2

(начало) .

 

 

 

ВВОД В ЯЗЫКЕ Си:

 

Си-программы,

которая

из

файла

1.

Написать

фрагмент

"exl.dat"

на

магнитном

диске

прочитает

указанные

ниже

значе-

ния:

 

 

1;

//

Ох FA

 

 

 

±пЬ

 

 

 

 

 

short

 

11/

//

-22

 

 

 

±nt

 

 

12;

//

074

 

 

 

float

 

 

f;

//

1.57

 

 

 

long-

 

1;

//

-125

 

 

 

char

 

 

ch.

//

'z'

 

 

 

45

 

str[

20

];//

"Нам

Тхань"

 

 

2,

Написать

вид

читаемых

данных (вид

строк

в файле

"exl.dat")

*/

1Сим­

вол

за% d D

о

О

х,Х

i

I

и

и

\e,E,f,

с

S

%

/ ? •

Р

Табл. 8. Способы преобразования символов при вводе

Тип, ожидаемый при вводе

Тип аргумента

Десятичное целое Десятичное целое Восьмеричное целое Восьмеричное целое

Шестнадцатеричное целое без префиксов

Ох или ОХ

Десятичное, шестнадцатеричное или вось­ меричное целое Десятичное, шестнадцатеричное или вось­ меричное целое Десятичное целое без знака Десятичное целое без знака

Величина с плавающей точкой из мантис­ сы и порядка Символ. Пробельные символы, которые

обычно пропускаются, считываются, если указано "с". Чтобы прочесть из потока сле­ дующий не пробельный символ, исполь­ зуйте формат Vols

Символьная строка

Символ %

Из потока ничего не читается

Величина в виде XXXX:YYYY^ где цифры X и Y являются шестнадцатеричными циф­ рами верхнего регистра

Указатель на int Указатель на long int Указатель на int Указатель па long int Указатель на int

Указатель на int

Указатель на long int

Указатель на unsigned int

Указатель на unsigned long int

Указатель из.float

Указатель на char

Указатель на символьный массив, достаточно больпюй, чтобы разместить вводимое поле и завер­ шающий нуль-символ '\0', добавляемый автоматиче­ ски

Не преобразуется, участвует во вводе как символ '%' Указатель на переменную типа int, в которую записы­ вается количество симво­ лов, считанных из потока вплоть до этой точки при текущем вызове функции

Указатель на объект

(far*

или near*). Формат %р вы­

полняет преобразование

указателя к требуемому

указателю используемой

модели памяти

|

46

^include

 

<stdio.h>

 

 

//

Для

функций

 

ввода-вывода

 

 

int main (

void

)

 

 

 

//

Возвращает

0

при

 

успехе

 

 

 

{

 

 

 

i ,

12;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Int

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

short

 

 

11;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

float

 

 

f;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

long

 

 

 

1;

str[

20

];

 

 

 

 

 

 

 

 

 

 

 

char

 

 

ch,

Указатель

на

структуру

со

 

 

FILE

 

 

*f_ln/

 

 

 

//

ввода

±nt

 

 

 

ret

code/

 

 

//

 

сведениями

о

файле

для

 

 

 

 

 

//

Возвращаемое

 

значение

для

 

 

 

 

 

 

 

 

 

 

 

//

 

 

fscanf

 

 

 

 

 

 

 

//

Открываем

файл

exl.dat

для

чтения

 

 

 

 

 

 

f_ln

=

fopenC

"exl.dat",

 

"г"

)

;

 

 

 

 

 

 

 

 

±f(

f__ln == NULL )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{

printf(

"\n

Файл

exl.dat

для

чтения

не

открыт.

" )

;

 

 

return

1;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//

Читаем

данные

из

файла

 

exl.dat

 

 

 

 

 

 

 

retcode

 

=

fscanf(

 

f_ln,

 

 

 

 

 

 

ch = %c

str=%s%c%s",

 

"

1 = %х ll

= %hd 12^%о f=^%f l = %41d874

±f(

&1,

&11,

&12,

Scf,

Sclr

&chr

str,

&str[3],

&str[4]

)

;

retcode

!= 9 )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{

prlntf(

"\n

Данные

в

fscanf

прочитаны

 

с ошибками."

) ;

 

 

 

return

2;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

return

 

0;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//Конец примера 2

Вид

строк

исходных

 

данных

в файле

exl.dat:

 

 

l^OxFA

11=-22

12=074

f=1.57

1=-125874

ch=z

 

 

str=HaM

Тхань

 

 

 

 

 

V

 

 

 

 

 

 

Из рассмотренного примера следует, что в общем случае структура формата имеет вид:

% ['^] [ширина ] [префикс] тип

Звездочка (*), следующая за знаком процента, подавляет запо­ минание следующего вводимого поля. Поле считывается в соответ-

47

ствии с форматом, но преобразованная величина никуда не записы­ вается. "Ширина" - положительное десятичное целое, задающее максимальное число символов при вводе. Если "ширина" избыточ­ ная, то чтение, как и ранее, выполняется до пробельного символа. Если "ширина" меньше, чем число символов до пробельного, то чи­

таются и преобразуются только символы числом не более

"ширина",

(см. пример 2).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Префиксами могут быть:

 

 

 

 

 

 

 

 

 

 

N - используется для печати адресов near (формат

%Np);

 

 

F - используется для печати адресов far

(формат УоГр);

 

 

h - для ввода коротких целых с типом short

(см. пример 2);

 

/ - для ввода длинных целых и вещественных с типом long (см.

пример 2).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рассмотрим еще один, более сложный, иллюстрирующий при­

мер.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

V7*Программа --пример

3

(начало) .

 

 

 

 

 

 

 

 

ВВОД В ЯЗЫКЕ Си:

 

Си-программы,

которая

 

из

файла

 

1.

Написать

 

 

фрагмент

 

"exl.dat"

на магнитном

диске

 

прочитает

указанные

ниже

значе-

ни

я:

 

 

±.

 

 

//

 

OxFA

или

250

 

 

 

 

 

 

±пЬ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11,

 

 

//

 

74

 

 

 

 

 

 

 

 

float

 

12;

 

//

 

18

 

 

 

 

 

 

 

 

 

f;

 

 

//

 

1,57

 

 

 

 

 

 

 

 

long-

 

1;

 

 

//

 

-125874

 

 

 

 

 

 

 

char

 

ch,

 

20

//

 

"Нам

Тхань"

 

 

 

 

 

 

 

 

 

str[

];//

 

 

 

 

 

 

 

2.

Написать

 

вид

читаемых

данных

 

(вид

строк

в

файле

"exl.dat")

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

V

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

^include

 

<stdlo.h>

 

//

 

Для

функций

ввода-вывода

 

 

±nt

main ( void

)

 

 

//

 

Возвращает

О при

успехе

 

 

{

Int

 

 

1,

 

11,

12;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

float

 

f;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

long

 

 

1;

 

str[

20

];

 

 

 

 

 

 

 

 

 

сЪаг

 

ch,

Указатель

 

на структуру

со

 

 

FILE

 

*f_ln;

 

//

 

ввода

 

±nt

 

 

ret

code;

 

//

 

сведениями

о

файле

для

 

 

 

 

//

Возвращаемое

значение

 

для

 

 

 

 

 

 

 

 

 

//

 

 

fscanf

 

 

 

 

 

 

//

Открываем

файл

exl.dat

 

 

для

чтения

 

 

 

 

 

 

f_ln

=

fopen(

 

 

"exl.dat",

 

"г"

) ;

 

 

 

 

 

 

 

±f(

f_ln

==

NULL )

 

 

 

 

 

 

 

 

 

 

 

{

48

 

printf

 

(

"\n

Файл

exl.dat

для

чтения

не

открыт. "

) ;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

//

Читаем

данные

из

файла

exl.dat

 

 

 

retcode

=

fscanf(

 

f_in,

 

 

 

&il,

&i2, &f,

&1,

 

" %х %d %о %f %ld

%c %s%c%s"r &±f

±f(

&ch,

str,

&str[3],

 

&str[4]

)

;

 

 

 

retcode

 

1=9)

 

 

 

 

 

 

 

 

{

printf(

 

"\n

Данные

в

fscanf

прочитаны

с ошибками."

) ;

 

 

 

r-etuirn

2;

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

//

За крыва

ем

файл

 

 

 

 

 

 

 

 

retcode

=

fclose(

f_in

)

;

 

 

 

 

 

±f(

retcode

 

== EOF )

 

 

 

 

 

 

 

 

{

printf(

 

"\n

Файл

exl.dat

не

закрыт."

)

;

 

 

 

 

 

return

3;

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

jzebvLzm

0;

 

 

 

 

 

 

 

 

 

 

 

}

//Конец примера 3

Вид строк

исходных

данных в файле

ех1.dat:

 

 

OxFA 074

 

 

22

1.57

-125874

z

 

Нам

Тхань

 

 

 

V

Вэтом примере /1 получает значение 74, так как читается по формату Vod (десятичный формат). Аналогично, /2 получает деся­ тичное значение 18, так как читается по формату Voo (восьмеричный формат - восьмеричный код 22 соответствует десятичному коду 18).

Взаключение отметим, что функция 5са«/идентична функции fscanf^ но вместо входного потока, заданного первым аргументом, она по умолчанию использует предопределенный входной поток stdin. По этой причине в вызове функции scan/ CUWCOK аргументов начинается сразу с управляющей строки.

2.4.3. Вывод с использованием функций printf-fprintf

Вначале рассмотрим и проанализируем пример. Особенностью приведенной ниже программы-примера также является ее оформле­ ние в виде, предусматривающем возможность выполнения на ЭВМ.

49