Fseek(указатель на файл, позиция, параметр)
где позиция – количество байтов (символов), отстоящих от заданного места, параметрSEEK_SET – начало файла,
SEEK_CUR – текущая позиция файла,
SEEK_END – конец файла.
Пример 1: прочитать символ из бинарного файла, отстоящий от начала файла на 9 байтов:
f_bin=fopen("D:/User/my_file.dat", "rb");
fseek(f_bin, 9, SEEK_SET);
fscanf(f_bin, "%c", &d);
printf("%c", d);
На экран будет выведено:
*
Пример 2: прочитать символ из бинарного файла, отстоящий от конца файла на 6 байтов:
f_bin=fopen("D:/User/my_file.dat", "rb");
fseek(f_bin, -6, SEEK_END);
fscanf(f_bin, "%c", &d);
printf("%c", d);
На экран будет выведено:
+
б) определение номера текущей позиции, занимаемой указателем файла (нумерация позиций начинается с нуля)
fgetpos(указатель на файл, fpos_t *pos)
где pos – текущая позиция указателя файла – переменная типа fpos_t (определен в stdio.h).
Пример: определить номера позиций начального и конечного символов файла:
fpos_t *nomer;
f_bin=fopen("D:/User/my_file.dat", "rb");
fgetpos(f_bin, &nomer); // номер начального символа
printf("\n nomer=%d", nomer);
while (!feof(f_bin)) // читаем файл до конца
{
fscanf(f_bin, "%c", &d);
}
fgetpos(f_bin, &nomer); // номер конечного символа
printf("\n nomer=%d", nomer);
На экран будет выведено:
nomer=0
nomer=15
Функции
В алгоритмах часто встречаются блоки, в которых процесс вычисления носит одинаковый характер, но требует использования различных исходных данных. Для каждого из таких повторяющихся блоков может быть составлена отдельная программа, причем таким образом, чтобы к ней можно было бы обратиться из любого места основной программы и после ее выполнения вернуться обратно в то же место, откуда к ней обратились. Такая отдельная программа, к которой можно обратиться из другой программы, называется подпрограммой.
Подпрограмма, произведя вычисления при заданных (входных) значениях аргументов, обеспечивает возврат в вызвавшую ее программу, причем в то же самое место, откуда она была вызвана. Разбиение большой программы на несколько мелких подпрограмм облегчает процесс программирования: маленькие подпрограммы легко читаются и понимаются, поэтому облегчается их отладка и тестирование. После того как подпрограмма написана и отлажена, можно забыть, как она сделана. Достаточно знать, какие входные аргументы необходимы для ее работы и что она дает на выходе.
Таким образом, подпрограмма представляет собой самостоятельную программу, имеющую входные и выходные аргументы (параметры), которая может быть написана и отлажена отдельно от других программ, а затем использована в них.
Примерами подпрограмм являются программы вычисления отдельных функций, имеющихся в библиотеках языков программирования, – стандартных функций, а также функций ввода-вывода. Эти подпрограммы размещены в системной библиотеке языка, подключаемой к программе пользователя при ее обработке. Значит, используя в своей программе, например, функцию printf, мы обращаемся к стандартной библиотеке ввода-вывода stdio.h, подсоединяемой к нашей программе директивой препроцессора #include <stdio.h>.
В дальнейшем мы будем рассматривать не стандартные подпрограммы, входящие в системные библиотеки, а подпрограммы, которые создает сам программист
в процессе решения конкретной задачи.
В отличие от Паскаля в языке Си используется только один вид подпрограмм – функции. Вообще любая программа на Си представляет собой совокупность взаимосвязанных функций, одна из которых является основной (головной) – main. С нее и начинается выполнение программы.
Функция – это подпрограмма, состоящая из заголовка, описания локальных (внутренних) переменных и блока (операторов, реализующих алгоритм вычислений). Она предназначена для вычисления единственного значения, зависящего от нескольких аргументов (формальных параметров).
Один из недостатков Паскаля заключался в том, что описание используемой функции нужно было помещать внутрь вызывающей ее программы, в раздел описания процедур и функций. В языке Си описание функций помещается отдельно от вызывающих программ, а перед заголовком main() основной программы помещаются прототипы (объявления) этих функций:
Директивы препроцессора
Прототипы функций
Void main()
{