ПРОИЗВОЛЬНЫЙ ДОСТУП: fseek( )

ПРОИЗВОЛЬНЫЙ ДОСТУП: fseek( )

     Функция fseek( ) позволяет нам обрабатывать файл подобно массиву и непосредственно достигать любого определенного байта в файле, открытом функцией fopen( ). Вот простой пример, показывающий, как она работает. Как и в наших предыдущих примерах, функция использует аргумент командной строки для получения имени файла, с которым она работает. Заметим, что fseek() имеет три аргумента и возвращает значение типа int.

/*использование fscek( ) для печати содержимого файла */

#include <stdio.h&

main(number, names) /* не следует использовать argc и argv */

int number;

char  *namеs[ ];

{

FILE *fp;

long offset = OL;  /*обратите внимание, что это тип long */

if(number < 2)

puts("Мне нужно имя файла в качестве аргумента.");

else {

if((fp = fopen(names[1], "r")) ==  0)

printf(" Я не могу открыть %s. ", names[1]);

else {

while(fseek(fp, offset++, 0) == 0)

putchar(getc(fp));

fclose(fp); }

    }

}

Первый из трех аргументов функции fseek( ) является указателем типа FILE на файл, в котором ведется поиск. Файл следует открыть, используя функцию fopen( ).

Второй аргумент назван "offset" (вот почему мы выбрали данное имя для переменной). Этот аргумент сообщает, как далеко следует передвинуться от начальной точки (см. ниже); он должен иметь значение типа long, которое может быть положительным (движение вперед) или отрицательным (движение назад).

Третий аргумент является кодом, определяющим начальную точку:

Код Положение в файле
0 начало файла
1 текущая позиция
2 конец файла

     Функция fseek( ) возвращает 0, если все хорошо, и -1, если есть ошибка, например попытка перемещаться за границы файла. Теперь мы можем разъяснить наш маленький цикл:

while(fseek(fp, offset++, 0)==0)

        putchar(getc(fp));

Поскольку переменная offset инициализирована нулем, при первом прохождении через цикл мы имеем выражение

fseek(fp, OL, 0)

означающее, что мы идем в файл, на который ссылается указатель fp, и находим байт, отстоящий на 0 байт от начала, т.е. первый байт. Затем функция putchar( ) печатает содержимое этого байта. При следующем прохождении через цикл переменная offset увеличивается до 1L, и печатается следующий байт. Посуществу, переменная offset действует подобно индексу для элементов файла. Процесс продолжается до тех пор, пока offset нe попытается попасть в fseek( ) после конца файла. В этом случае fseek( ) возвращает значение - 1 и цикл прекращается.

     Этот последний пример чисто учебный. Нам нe нужно использовать fseek( ), потому что getc( ) так или иначе проходит через файл байт за байтом; fseek( ) приказала getc( ) "посмотреть" туда, куда она сама уже собиралась посмотреть.

     Вот пример (рис. 15.2), в котором выполняется что-то несколько более необычное (Мы благодарим Вильяма Шекспира за этот пример в пьесе "Двенадцатая ночь").

/* чередование печати в прямом и обратном направлениях */

#include <stdio.h>

main(number, names) /* вам не нужно применять argc и argv */

int number;

char *names[ ];

{

FILE *fp;

long offset = 0L;

if(number < 2)

puts(" Мне нужно имя файла в качестве аргумента.");

else {

if(fp = fopen(names[l], "r")) == 0)

printf(" Я не могу открыть %s. ", names[l]);

else {

while(fseek(fp, offset++, 0) == 0)

{ putchar(getc(fp));

if(fseek(fp, -(offset + 3), 2) == 0)

putchar(getc(fp)); }

fclose(fp); }

} }

РИС. 15.2. Программа, чередующая печать в прямом и обратном направлениях.

Применение этой программы к файлу, содержащему имя "Мальволио", дает такой приятный результат:

МоаилльоввоьллиаоМ

Наша программа печатает первый символ файла, затем последний, затем второй, затем предшествующий последнему и т.д. Мы только добавили вот эти строки в последнюю программу:

if(fseek(fp, -(offset + 3), 2) == 0)

     putchar(getc(fp));

     Код 2 в операторе предполагает, что мы будем считать позиции от конца файла. Знак минус означает счет в обратном направлении. +3 стоит здесь потому, что мы начинаем с последнего регулярного символа файла и пропускаем несколько символов "новая строка" и EOF в самом конце файла. (Точное значение этой корректировки зависит от типа системы. Наши файлы имеют в конце по два символа новой строки, за которыми следуют два EOF, поэтому мы как раз их и обходим.)

     Таким образом, эта часть программы чередует печать в обратном направлении и печать в прямом направлении. Следует заметить, что в некоторых системах может не предусматриваться код 2 для fseek( ).

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Межапартаментный доступ

Из книги Сущность технологии СОМ. Библиотека программиста автора Бокс Дональд

Межапартаментный доступ Для того чтобы объекты могли находиться в апартаментах, отличных от апартаментов клиента, в СОМ предусмотрена возможность экспорта интерфейсов из одного апартамента и импорта их в другой. Чтобы сделать интерфейс объекта видимым вне апартамента


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

Из книги Реестр Windows автора Климов Александр

Доступ к сайтам Чтобы убрать ограничение на доступ к сайтам в IE достаточно удалить все параметры из раздела


Доступ к принтерам

Из книги Домашние и офисные сети под Vista и XP автора Ватаманюк Александр Иванович

Доступ к принтерам Часто кому-то бывает необходимо распечатать информацию, а принтера у него под рукой нет. Если вы подключены к сети и у вас есть принтер, то вы можете стать настоящим спасителем, если предоставите его в общее пользование. Тем более что сделать это не


Доступ

Из книги Советы по Delphi. Версия 1.0.6 автора Озеров Валентин


21.7.1. Доступ к Интернет

Из книги Linux-сервер своими руками автора Колисниченко Денис Николаевич

21.7.1. Доступ к Интернет Прежде всего определимся, нужен ли вашему игровому залу доступ к Интернет. Если нужен, то для каких целей. В большинстве случаев он нужен для того, чтобы посетители могли использовать так называемые Online-версии игр или подсоединяться к всемирным


Доступ к GUI

Из книги Asterisk™: будущее телефонии Второе издание автора Меггелен Джим Ван

Доступ к GUI После завершения установки и перезагрузки компьютера можно переходить к GUI Asterisk. URL, используемый для доступа к GUI Asterisk, - это IP-адрес или имя хоста, которое выводится на экран после перезагрузки компьютера. Введите этот IP-адрес в адресной строке броузера. С


2.3.2 Доступ с терминала

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

2.3.2 Доступ с терминала В начале 70-х гг. многие производители компьютеров создавали модели терминалов, которые были совместимы только с их собственными компьютерными системами. Министерство обороны США закупало оборудование у различных производителей и, естественно,


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

Из книги Руководство по переходу на Ubuntu 10.04 LTS «Lucid Lynx» автора Неворотин Вадим

2.4.1 Доступ к файлам Файловые серверы дают пользователю возможность работать с удаленными файлами так, как если бы они располагались на локальной системе. Первоначально файловые серверы получили распространение в локальных сетях персональных компьютеров как средство


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

Из книги Linux программирование в примерах автора Роббинс Арнольд

16.2 Доступ к файлам В предыдущей главе я уже рассказал про права доступа к файлам, поэтому лишь кратко напомню: в Linux можно с помощью механизма разграничения прав ограничить доступ к файлу на редактирование или же просто полностью запретить доступ к содержимому. Например,


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

Из книги Недокументированные и малоизвестные возможности Windows XP автора Клименко Роман Александрович

4.5. Произвольный доступ: перемещения внутри файла До сих пор мы обсуждали последовательный ввод/вывод, при котором данные читаются или записываются с начала файла и продолжаются до его конца. Часто это все, что требуется программе. Однако, возможно осуществление


Удаленный доступ

Из книги Linux глазами хакера автора Флёнов Михаил Евгеньевич

Удаленный доступ Удаленным доступом (DialUP) называют получение доступа к разрешенным папкам компьютера с помощью модема или виртуального частного соединения (VPN). Поскольку VPN является не таким уж частым гостем на домашних компьютерах пользователей, то в данной главе будет


6.2.4. Общий доступ

Из книги Домены. Все, что нужно знать о ключевом элементе Интернета автора Венедюхин Александр

6.2.4. Общий доступ Чаще всего, на сервере необходима директория, через которую любой пользователь сможет обмениваться файлами с другими участниками сети. Для настройки такой папки используется секция [tmp]:;[tmp]; comment = Temporary file space; path = /tmp; read only = no; public = yesПо умолчанию секция


10.3.1. Доступ

Из книги Офисный компьютер для женщин автора Пастернак Евгения

10.3.1. Доступ Такие директивы определяют основные права доступа к FTP-серверу. Давайте рассмотрим основные из них:? class имя type адреса — позволяет организовать классы пользователей по их типу и адресу. В нашем конфигурационном файле указана следующая строка:class all anonymous,guest,real


10.3.3. Доступ по операциям

Из книги автора

10.3.3. Доступ по операциям Помимо этого, в файле ftpaccess может быть описание основных операций и прав доступа к ним. В общем виде это выглядит следующим образом:Действие yes|no пользовательВ качестве действия можно указать одно из следующих значений: chmod, delete, overwrite, rename или umask.


Уверенный доступ

Из книги автора

Уверенный доступ Если под зарегистрированным доменным именем размещаются какие-то ресурсы, то домен нужно привязать к определенным серверам DNS, обеспечивающим преобразование символьных имен внутри домена в адреса компьютеров, обслуживающих ресурсы. Например, адрес


Произвольный показ

Из книги автора

Произвольный показ Произвольный показ – это заданная вами последовательность слайдов. Для чего это нужно? Рассказываю.Допустим, у вас есть презентация длиной в 20 слайдов:• слайд 1 – название презентации, тема;• слайды 2, 3, 4, 5 – теория;• слайды 6, 7, 8, 9, 10 – задачи, причем в