Давыдов В.Г. - Программирование и основы алгоритмизации - 2003
.pdfvoid |
convert |
( |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
±nt |
|
|
ch |
) |
|
|
// |
Изображаемый |
символ |
|
|
|||||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf( |
"Символ |
|
10 |
код |
|
8 |
код |
|
16 |
код |
\п" |
) |
; |
|||||
// |
|
Непечатные |
|
символы |
|
имеют десятичные |
коды |
О.. |
31, |
а |
||||||||
// |
|
десятичный |
|
код |
символа |
' |
' |
равен |
32 |
|
|
|
|
|||||
± |
f ( c h |
< ' ' |
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf( |
"Управляющий |
|
(непечатный) |
символ: |
|
\п" |
) ; |
|||||||||
// |
|
Обратите |
внимание, |
|
что |
один |
|
и |
тот |
же |
символ |
|
печатается |
|||||
// |
|
вначале |
в |
символьном |
|
формате |
%с, |
а |
затем |
|
|
|||||||
// |
|
соответственно |
|
в |
форматах |
|
десятичного |
|
%d, |
|
|
|||||||
// |
|
восьмеричного |
%о |
и |
16-ричного |
|
%к чисел. |
|
Число |
|||||||||
// |
|
форматов |
и |
количество |
|
следующих |
за |
|
управляющей |
|||||||||
// |
|
строкой |
аргументов |
|
|
совпадают |
|
|
|
|
|
|
||||||
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 |
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
{ |
|
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