45940 (665245), страница 16

Файл №665245 45940 (Язык С) 16 страница45940 (665245) страница 162016-07-31СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 16)

DOUBLE SUM, V;

SUM =0;

WHILE (SCANF(“%LF”, &V) !=EOF)

PRINTF(“\T%.2F\N”, SUM += V);

\)

выполнение функции SCANF заканчивается либо тогда, когда она

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

элемент ввода не совпадает с управляющей спецификацией. В

качестве своего значения она возвращает число правильно сов-

падающих и присвоенных элементов ввода. Это число может быть

  • 159 -

использовано для определения количества найденных элементов

ввода. при выходе на конец файла возвращается EOF; подчерк-

нем, что это значение отлично от 0, что следующий вводимый

символ не удовлетворяет первой спецификации в управляющей

строке. При следующем обращении к SCANF поиск возобновляется

непосредственно за последним введенным символом.

Заключительное предостережение: аргументы функции SCANF

должны быть указателями. Несомненно наиболее распространен-

ная ошибка состоит в написании

SCANF(“%D”, N);

вместо

SCANF(“%D”, &N);

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

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 -

7.7. Обработка ошибок - STDERR и EXIT

Обработка ошибок в CAT неидеальна. Неудобство заключает-

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

зывается недоступным, диагностическое сообщение об этом пе-

чатается в конце объединенного вывода. Это приемлемо, если

вывод поступает на терминал, но не годится, если вывод пос-

тупает в некоторый файл или через поточный (PIPELINE) меха-

низм в другую программу.

Чтобы лучше обрабатывать такую ситуацию, к программе

точно таким же образом, как STDIN и STDOUT, присоединяется

второй выходной файл, называемый STDERR. Если это вообще

возможно, вывод, записанный в файле STDERR, появляется на

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

ляется в другое место.

Давайте переделаем программу CAT таким образом, чтобы

сообщения об ошибках писались в стандартный файл ошибок.

“INCLUDE

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(STDERR,

“CAT: CAN'T OPEN,%S\N”, ARGV);

EXIT(1);

\) ELSE \(

FILECOPY(FP);

\)

EXIT(0);

\)

Программа сообщает об ошибках двумя способами. Диагностичес-

кое сообщение, выдаваемое функцией FPRINTF, поступает в

STDERR и, таким образом, оказывается на терминале пользова-

теля, а не исчезает в потоке (PIPELINE) или в выходном фай-

ле.

Программа также использует функцию EXIT из стандартной

библиотеки, обращение к которой вызывает завершение выполне-

ния программы. Аргумент функции EXIT доступен любой програм-

ме, обращающейся к данной функции, так что успешное или неу-

дачное завершение данной программы может быть проверено дру-

гой программой, использующей эту в качестве подзадачи. По

соглашению величина 0 в качетсве возвращаемого значения сви-

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

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

  • 164 -

Функция EXIT вызывает функцию FCLOSE для каждого откры-

того выходного файла, с тем чтобы вывести всю помещенную в

буферы выходную информацию, а затем вызывает функцию _EXIT.

Функция _EXIT приводит к немедленному завершению без очистки

Характеристики

Тип файла
Документ
Размер
2,35 Mb
Материал
Тип материала
Учебное заведение
Неизвестно

Список файлов реферата

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6521
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее