![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Форматный ввод - функция scanfСодержание книги
Поиск на нашем сайте
7.5. Форматное преобразование в памяти
Доступ к файлам Все до сих пор написанные программы читали из стандарт-ного ввода и писали в стандартный вывод, относительно кото-рых мы предполагали, что они магическим образом предоставле-ны программе местной операционной системой. Следующим шагом в вопросе ввода-вывода является написа-ние программы, работающей с файлом, который не связан зара-нее с программой. одной из программ, которая явно демонстри-рует потребность в таких операциях, является 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); Первым аргументом функции 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(C) PUTC(C,STDOUT)При работе с файлами для форматного ввода и вывода можно ис-пользовать функции FSCANF и FPRINTF. Они идентичны функциямSCANF и PRINTF, за исключением того, что первым аргументомявляется указатель файла, определяющий тот файл, который бу-дет читаться или куда будет вестись запись; управляющаястрока будет вторым аргументом. Покончив с предварительными замечаниями, мы теперь всостоянии написать программу 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 вызы-вается автоматически для каждого открытого файла).
|
||||||||
Последнее изменение этой страницы: 2016-08-26; просмотров: 262; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.183.216 (0.011 с.) |