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

Язык С
Строк программы, исключая математическое обеспечение Является учебным введением в центральную часть языка “C” Hачинаем. Единственный способ освоить новый язык Оператор FOR Набор полезных программ Подсчет символов Подсчет слов Функции Аргументы - вызов по значению Область действия: внешние переменные Резюме Константы Описания Преобразование типов До 9 и буквы от а до F Операции и выражения присваивания Старшинство и порядок вычисления Операторы и блоки Переключатель Цикл DO - WHILE Оператор CONTINUE Основные сведения Функции, возвращающие нецелые значения Еще об аргументах функций Правила, определяющие область действия Статические переменные Блочная структура Рекурсия Указатели и адреса Указатели и массивы Адресная арифметика Указатели символов и функции Указатели - не целые До 12, а не от 0 до 11. Так как за экономию памяти у нас пока не награждают, такой способ проще, чем подгонка индек-сов Инициализация массивов указателей Указатели на функции Структуры Структуры и функции Указатели на структуры Мы продемонстрируем, как правильно выполнить эту задачу Поля Определение типа Обращение к стандартной библиотеке Форматный вывод - функция PRINTF Форматный ввод - функция SCANF Форматное преобразование в памяти Обработка ошибок - STDERR и EXIT Обращение к системе Низкоуровневый ввод/вывод - операторы READ и WRITE Произвольный доступ - SEEK и LSEEK Пример - распечатка справочников Пример - распределитель памяти Константы Синтаксическая нотация Преобразования Первичные выражения Унарные операции Аддитивные операции Операция присваивания Спецификаторы типа Описание структур и объединений Инициализация TYPEDEF Оператор SWITCH Внешнее определение функции Область действия внешних идентификаторов Неявные описания Явные преобразования указателей Анахронизмы Операторы
439386
знаков
0
таблиц
0
изображений

7.5. Форматное преобразование в памяти

 

 

 

От функции SCANF и PRINTF происходят функции SSCANF и

SPRINTF, которые осуществляют аналогичные преобразования, но

оперируют со строкой, а не с файлом. Обращения к этим функ-

циям имеют вид:

 

SPRINTF(STRING, CONTROL, ARG1, ARG2, ...)

SSCANF(STRING, CONTROL, ARG1, ARG2, ...)

Как и раньше , функция SPRINTF преобразует свои аргументы

ARG1, ARG2 и т.д. В соответствии с форматом, указанным в

CONTROL, но помещает результаты в STRING, а не в стандартный

вывод. KОнечно, строка STRING должна быть достаточно велика,

чтобы принять результат. Например, если NAME - это символь-

ный массив, а N - целое, то

 

SPRINTF(NAME, “TEMP%D”, N);

создает в NAME строку вида TEMPNNN, где NNN - значение N.

Функция SSCANF выполняет обратные преобразования - она

просматривает строку STRING в соответствии с форматом в ар-

гументе CONTROL и помещает результирующие значения в аргу-

менты ARG1, ARG2 и т.д.эти аргументы должны быть указателя-

ми. В результате обращения

 

SSCANF(NAME, “TEMP%D”, &N);

переменная N получает значение строки цифр, следующих за

TEMP в NAME.

Упражнение 7-2.

Перепишите настольный калькулятор из главы 4, используя

для ввода и преобразования чисел SCANF и/или SSCANF.

·    
160 -

7.6. Доступ к файлам

Все до сих пор написанные программы читали из стандарт-

ного ввода и писали в стандартный вывод, относительно кото-

рых мы предполагали, что они магическим образом предоставле-

ны программе местной операционной системой.

Следующим шагом в вопросе ввода-вывода является написа-

ние программы, работающей с файлом, который не связан зара-

нее с программой. одной из программ, которая явно демонстри-

рует потребность в таких операциях, является CAT, которая

объединяет набор из нескольких именованных файлов в стандар-

тный вывод. Программа CAT используется для вывода файлов на

терминал и в качестве универсального сборщика ввода для

программ, которые не имеют возможности обращаться к файлам

по имени. Например, команда

 

CAT X.C.Y.C

печатает содержимое файлов X.C и Y.C в стандартный вывод.

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

ванных файлов, т.е., как связать внешние имена, которыми

мыслит пользователь, с фактически читающими данные операто-

рами.

 

Эти правила просты. Прежде чем можно считывать из неко-

торого файла или записывать в него, этот файл должен быть

открыт с помощью функции FOPEN из стандартной библиотеки.

функция FOPEN берет внешнее имя (подобное X.C или Y.C), про-

водит некоторые обслуживающие действия и переговоры с опера-

ционной системой (детали которых не должны нас касаться) и

возвращает внутреннее имя, которое должно использоваться при

последующих чтениях из файла или записях в него.

Это внутреннее имя, называемое “указателем файла”, фак-

тически является указателем структуры, которая содержит ин-

формацию о файле, такую как место размещения буфера, текущая

позиция символа в буфере, происходит ли чтение из файла или

запись в него и тому подобное. Пользователи не обязаны знать

эти детали, потому что среди определений для стандартного

ввода-вывода, получаемых из файла STDIO.H, содержится опре-

деление структуры с именем FILE. Единственное необходимое

для указателя файла описание демонстрируется примером:

FILE *FOPEN(), *FP;

Здесь говорится, что FP является указателем на FILE и

FOPEN возвращает указатель на FILE. Oбратите внимание, что

FILE является именем типа, подобным INT, а не ярлыку струк-

туры; это реализовано как TYPEDEF. (Подробности того, как

все это работает на системе UNIX, приведены в главе 8).

Фактическое обращение к функции FOPEN в программе имеет

вид:

FP=FOPEN(NAME,MODE);

·    
161 -

Первым аргументом функции FOPEN является “имя” файла, кото-

рое задается в виде символьной строки. Второй аргумент MODE

(“режим”) также является символьной строкой, которая указы-

вает, как этот файл будет использоваться. Допустимыми режи-

мами являются: чтение (“R”), запись (“W”) и добавление

(“A”).

Если вы откроете файл, который еще не сущетвует, для за-

писи или добавления, то такой файл будет создан (если это

возможно). Открытие существующего файла на запись приводит к

отбрасыванию его старого содержимого. Попытка чтения несу-

ществующего файла является ощибкой. Ошибки могут быть обус-

ловлены и другими причинами (например, попыткой чтения из

файла, не имея на то разрешения). При наличии какой-либо

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

(которое для удобства также определяется в файле STDIO.H).

Другой необходимой вещью является способ чтения или за-

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

ностей, из которых GETC и PUTC являются простейшими.функция

GETC возвращает следующий символ из файла; ей необходим ука-

затель файла, чтобы знать, из какого файла читать. Таким об-

разом,

C=GETC(FP)

помещает в “C” следующий символ из файла, указанного посред-

ством FP, и EOF, если достигнут конец файла.

Функция PUTC, являющаяся обращением к функции GETC,

PUTC(C,FP)

помещает символ “C” в файл FP и возвращает “C”. Подобно фун-кциям GETCHAR и PUTCHAR, GETC и PUTC могут быть макросами, а не функциями.

При запуске программы автоматически открываются три фай-

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

файлами являются стандартный ввод, стандартный вывод и стан-

дартный вывод ошибок; соответствующие указатели файлов назы-

ваются STDIN, STDOUT и STDERR. Обычно все эти указатели свя-

заны с терминалом, но STDIN и STDOUT могут быть перенаправ-

лены на файлы или в поток (PIPE), как описывалось в разделе

7.2.

Функции GETCHAR и PUTCHAR могут быть определены в терми-

налах GETC, PUTC, STDIN и STDOUT следующим образом:

#DEFINE GETCHAR() GETC(STDIN) #DEFINE PUTCHAR© PUTC(C,

STDOUT)

При работе с файлами для форматного ввода и вывода можно ис-

пользовать функции FSCANF и FPRINTF. Они идентичны функциям

SCANF и PRINTF, за исключением того, что первым аргументом

является указатель файла, определяющий тот файл, который бу-

дет читаться или куда будет вестись запись; управляющая

строка будет вторым аргументом.


·     162 -

Покончив с предварительными замечаниями, мы теперь в

состоянии написать программу CAT для конкатенации файлов.

Используемая здесь основная схема оказывается удобной во

многих программах: если имеются аргументы в командной стро-

ке, то они обрабатываются последовательно. Если такие аргу-

менты отсутствуют, то обрабатывается стандартный ввод. Это

позволяет использовать программу как самостоятельно, так и

как часть большей задачи.

 

#INCLUDE <STDIO.H>

MAIN(ARGC, ARGV) /*CAT: CONCATENATE FILES*/

INT ARGC;

CHAR *ARGV[];

\(

FILE *FP, *FOPEN();

IF(ARGC==1) /*NO ARGS; COPY STANDARD INPUT*/

FILECOPY(STDIN);

ELSE

WHILE (--ARGC > 0)

IF ((FP=FOPEN(*++ARGV,”R”))==NULL) \(

PRINTF(“CAT:CAN'T OPEN %\N”,*ARGV);

BREAK;

\) ELSE \(

FILECOPY(FP);

FCLOSE(FP);

\)

\)

FILECOPY(FP) /*COPY FILE FP TO STANDARD OUTPUT*/

FILE *FP;

\(

INT C;

WHILE ((C=GETC(FP)) !=EOF)

PUTC(C, STDOUT);

\)

 

Указатели файлов STDIN и STDOUT заранее определены в библио-

теке ввода-вывода как стандартный ввод и стандартный вывод;

они могут быть использованы в любом месте, где можно исполь-

зовать объект типа FILE*.они однако являются константами, а

не переменными, так что не пытайтесь им что-либо присваи-

вать.

Функция FCLOSE является обратной по отношению к FOPEN;

она разрывает связь между указателем файла и внешним именем,

установленную функцией FOPEN, и высвобождает указатель файла

для другого файла.большинство операционных систем имеют не-

которые ограничения на число одновременно открытых файлов,

которыми может распоряжаться программа. Поэтому, то как мы

поступили в CAT, освободив не нужные нам более объекты, яв-

ляется хорошей идеей. Имеется и другая причина для примене-

ния функции FCLOSE к выходному файлу - она вызывает выдачу

информации из буфера, в котором PUTC собирает вывод. (При

нормальном завершении работы программы функция FCLOSE вызы-

вается автоматически для каждого открытого файла).

·      
163 -

 


Информация о работе «Язык С»
Раздел: Информатика, программирование
Количество знаков с пробелами: 439386
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
48443
0
0

... основаниям. При этом философская абстракция языка оказывается неразрывно связана с основными темами и движениями философии в целом. Более конкретно, на ранние стадии традиционно рассматриваемого в рамках АФ анализа обыденного языка глубокое влияние оказала философия Дж. Э. Мура, особенно его учение о здравом смысле, согласно которому такие понятия, как «человек», «мир», «я», «внешний мир», « ...

Скачать
43709
0
0

... и других странах СНГ, а также облегчение доступа к русской и мировой культуре и науке. Таким образом, судя по данным наших исследований, востребованность русского языка осталась в республике достаточно высокой. Многие представители современной молдавской молодежи продолжают, как их отцы и деды, тянуться к русской культуре, научным и техническим достижениям России. Русский язык остается языком ...

Скачать
39778
0
1

... рисуночное словесно-слоговое письмо). Памятники среднеэламского периода (14—12 вв. до н.э.) выполнены аккадской клинописью. Памятники новоэламского периода относятся к 8—6 вв. до н.э. Был официальным языком в персидском государстве Ахеменидов в 6—4 вв. предполагается, что он, подвергшись влиянию древнеперсидского, сохранился до раннего средневековья. 7. Бурушаски язык Язык бурушаски ( ...

Скачать
64931
0
0

... /диалект), скифский, согдийский, среднеперсидский, таджикский, таджриши (язык/диалект), талышский, татский, хорезмийский, хотаносакский, шугнано-рушанская группа языков, ягнобский, язгулямский и др. Они относятся к индоиранской ветви индоевропейских языков. Области распространения: Иран, Афганистан, Таджикистан, некоторые районы Ирака, Турции, Пакистана, Индии, Грузии, Российской Федерации. Общее ...

0 комментариев


Наверх