double arrow

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


От функции scanf и printf происходят функции sscanf иsprintf, которые осуществляют аналогичные преобразования, нооперируют со строкой, а не с файлом. Обращения к этим функ-циям имеют вид: -58- sprintf(string, control, arg1, arg2, ...) sscanf(string, control, arg1, arg2, ...) Как и раньше , функция sprintf преобразует свои аргументыarg1, arg2 и т.д. в соответствии с форматом, указанным вcontrol, но помещает результаты в string, а не в стандартныйвывод. Конечно, строка 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.

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

Описанные в начале данного раздела программы читают изстандартного ввода и пишут в стандартный вывод, которые пре-доставляются программе операционной системой. Для программ, которые сами должны организовывать связьс файлами, в библиотеке ввода/вывода действуют следующиеправила. Прежде чем считывать из некоторого файла или записы-вать в него, этот файл должен быть открыт с помощью функцииopen из стандартной библиотеки. Функция fopen берет внешнееимя (подобное х.c или "temp002") и возвращает внутреннееимя, которое должно использоваться при последующих чтенияхиз файла или записях в него. Это внутреннее имя, называемое "указателем файла", фак-тически является указателем структуры, которая содержитинформацию о файле, такую как место размещения буфера, теку-щая позиция символа в буфере, происходит ли чтение из файлаили запись в него и тому подобное. Пользователи не обязанызнать эти детали, потому что среди определений, получаемыхиз файла stdio.h, содержится определение этой структуры.Единственное необходимое для указателя файла описание демонстрируется примером: FILE *fp; -59- Здесь говорится, что fp является указателем на FILE.Обратите внимание, что file является именем типа, подобнымint, а не ярлыком структуры; это реализовано через"#define". Обращение к функции fopen в программе имеет вид:fp=fopen(name,mode);Первым аргументом функции fopen является имя файла, котороезадается в виде символьной сроки "name". Второй аргументmode (режим) также является символьной строкой, которая ука-зывает, как этот файл будет использоваться. Допустимымирежимами являются: чтение (r), запись (w) и добавление (a),возможен еще символ + справа (например, r+), который озна-чает, что возможно и чтение, и запись в файл. Если вы откроете файл, который еще не существует, длязаписи или добавления, то такой файл будет создан (если этовозможно). Открытие существующего файла на запись приводитк отбрасыванию его старого содержимого. Попытка чтения несу-ществующего файла является ощибкой. Ошибки могут быть обус-ловлены и другими причинами (например, попытка чтения изфайла, не имея на то разрешения). При наличии какой-либоошибки функция возвращает нулевое значение указателя NULL(которое для удобства также определяется в файле stdio.h). Другой необходимой вещью является способ чтения илизаписи, если файл уже открыт. Здесь имеется несколько воз-можностей, из которых getc и putc являются простейшими.Функция getc считывает из файла следующий символ; ей необхо-дим указатель файла, чтобы знать, из какого файла читать. Обращение: c=getc(fp)помещает в c следующий символ из файла, указанного посредст-вом fp, и EOF, если достигнут конец файла. Функция putc: putc(c,fp)помещает символ c в файл fp и возвращает c. Подобно функциямgetchar и putchar, getc и putc могут быть макросами, а нефункциями. При запуске программы автоматически открываются трифайла, которые снабжены определенными указателями файлов.Этими файлами являются стандартный ввод, стандартный вывод истандартный вывод ошибок; соответствующие указатели файловназываются stdin, stdout и stderr. Обычно все эти указателисвязаны с терминалом, но stdin и stdout могут быть перенап-равлены на файлы или в межпроцессный канал. Функции getchar и putchar могут быть определены в тер-минах getc, putc, stdin и stdout следующим образом: #define getchar() getc(stdin) #define putchar(c) putc(c, stdout) -60- При работе с файлами для форматного ввода и вывода можноиспользовать функции fscanf и fprintf. Они идентичны функ-циям scanf и printf, за исключением того, что первым аргу-ментом является указатель файла, определяющий тот файл,который будет читаться или куда будет вестись запись; управ-ляющая строка будет вторым аргументом. Указатели файлов stdin и stdout заранее определены вбиблиотеке ввода-вывода как стандартный ввод и стандартныйвывод; они могут быть использованы в любом месте, где можноиспользовать объект типа FILE *. Они, однако, являются конс-тантами, а не переменными, так что их нельзя изменять. Функция fclose является обратной по отношению к fopen;она разрывает связь между указателем файла и внешним именем,установленную функцией fopen, и высвобождает указатель файладля другого файла. В операционной системе имеются ограниче-ния на число одновременно открытых файлов, которыми можетраспоряжаться программа. Функция fclose закрывает файл, атакже вызывает выдачу информации из буфера, в котором putcсобирает вывод (при нормальном завершении программы функцияfclose вызывается автоматически для каждого открытогофайла).

Сейчас читают про: