Ftell и fgetpos

 

Прототип функции ftell (из <stdio.h>):

long int ftell(File *f);

Функция ftell возвращает текущую позицию в файле, связанном с потоком f, как длинное целое. В случае ошибки возвращает число (-1).

 

Прототип функции fgetpos (из <stdio.h>):

int fgetpos (File *f, fpos_t *pos);

Функция fgetpos возвращает текущую позицию в файле, связанном с потоком f, и копирует значение текущей позиции по адресу pos. Это значение позднее может использоваться функцией. Возвращаемое значение имеет тип fpos_t, который используется функциями fgetpos и fsetpos для хранения текущей позиции файла:

typedef long fpos_t;

 

1.3.3. Функции задания положения указателя fseek и fsetpos

 

Прототип функции fseek :

int fseek (File *f, long off, int org);

Функция перемещает текущую позицию в файле, связанном с потоком f, на позицию off, отсчитываемую от значения org, которое должно быть равно одной из констант, определенных в <stdio.h>:

SEEK_CUR – от текущей позиции указателя (1);

SEEK_END – от конца файла (2);

SEEK_SET - от начала файла (0).

Параметр off задает количество байтов, на которое необходимо сместить указатель соответственно параметру org. Величина смещения может быть как положительной, так и отрицательной, но нельзя сместиться за пределы начала файла. Такой доступ к данным в файле называется произвольным.

Функция возвращает …

Прототип функции fsetpos :

int fsetpos (File *f, const fops_t *pos);

Функция перемещает текущую позицию в файле, связанном с потоком f, на позицию *pos, предварительно полученную с помощью функции fgetpos.

Примечание. Функции fseek и fsetpos нельзя использовать для стандартных потоков.

Функция rewind очищает флаги ошибок при работе с потоками и переходит к началу файла. Ее прототип:

void rewind( File *f );

 

 

1.3.4.Функции чтения и записи потока байтов fread и fwrite

 

Прототип функции fread:

size_t fread (void *buffer, size_t size, size_t count, FILE *stream);

Функция считывает count элементов длиной size байтов в область, заданную указателем buffer, из потока stream. Возвращает количество прочитанных элементов, которое может быть меньше count, если при чтении произошла ошибка или встретился конец файла.

Прототип функции fwrite:

size_t fwrite (const void *p, size_t size, size_t, FILE *);

Функция записывает n элементов длиной size байтов из буфера, заданного указателем p, в поток f. Возвращает число записанных элементов.

 

1.3.5. Функции чтения символа из потока (getс, fgetс, getchar)

Функция getс, имеющая прототип:

int getc (FILE *f);

возвращает очередной символ в формате int из потока f. Если символ не может быть прочитан, то возвращает значение EOF.

Функция fgetс, имеющая прототип:

int fgetc (FILE *f);

возвращает очередной символ в формате int из потока f. Если символ не может быть прочитан, то возвращает значение EOF.

Функция getchar, имеющая прототип:

int getchar (void);

возвращает очередной символ в формате int из стандартного потока (stdin). Если символ не может быть прочитан, то возвращает значение EOF.

 

1.3.6. Функции записи символа в поток (putc, fputc, putchar)

Функция puts записывает символ ch в поток f. При ошибке возвращает значение EOF. Ее прототип:

int putc (int ch, FILE *f);

Выполняется аналогично функция fputc. Ее прототип:

int fputc (int ch, FILE *f);

 

Функция putchar выводит символ ch на стандартное устройство вывода, добавляя в конце символ новой строки. Возвращает неотрицательноу значение при успехе или EOF – при ошибке.

 

 

1.3.7. Функции чтения строки из потока (fgets, gets)

Прототип функции fgets:

char *fgets (char *s, int n, FILE *f);

Функция читает не более n-1 байт из потока f в строку s, прекращая чтение при обнаружении символа новой строки или конца файла. Символ новой строки при чтении не отбрасывается, помещается конец строки s. Прочитанная строка дополняется ограничителем строки ('\0'). При обнаружении ошибки или конца файла возвращает NULL, в противном случае – указатель на строку s.

Функция читает символы с клавиатуры до появления символа новой строки и помещает их в строку s. Сам символ новой строки в строку не включается. Возвращает указатель на s. Прототип функции gets:

char *gets (char *s);

 

1.3.8. Функции записи строки в поток (fputs, puts)

Прототип функции fputs:

int fputs (const char * s, FILE *f);

Функция fputs записывает строку символов s в поток f. Символ конца строки в файл не записывается. При ошибке возвращает значение EOF, иначе – неотрицательное число.

Функция puts выводит строку s на стандартное устройство вывода, добавляя в конце символ новой строки. Возвращает неотрицательное значение при успехе или EOF – при ошибке. Прототип функции puts:

int puts (char *s);

 

1.3.9. Функции форматированного ввода из потока (, scanf, sscanf)

 

Прототип функции fscanf:

intfscanf (FILE *f, const char *fmt [, par1, par2, …]);

Эта функция вводит (читает) строку параметров par1, par2, … в формате, определенном строкой fmt, из файла f. Возвращает число переменных, которым присвоено значение.

Прототип функции scanf:

intscanf (const char *fmt [, par1, par2, …]);

Функция scanf вводит (читает) строку параметров par1, par2, … в формате, определенном строкой fmt, со стандартного устройства ввода (обычно с клавиатуры (stdin)). Возвращает число переменных, которым присвоено значение.

Прототип функции sscanf:

intsscanf (const char *buf, const char *fmt [, par1, par2, …]);

Функция sscanf вводит данные аналогично функции scanf, но не с клавиатуры, а из строки символов, переданной ей первым параметром. Аргумент buf – строка символов, из которой вводятся значения, fmt - строка формата, в соответствии с которой происходит преобразование данных. Многоточие указывает на наличие необязательных аргументов, соответствующих адресам вводимых значений.

 

1.3.10. Функции форматированного вывода в поток (fprintf, printf, sprintf)

 

Прототип функции fprintf:

int fprintf (FILE *f, const char *fmt, );

Функция записывает в поток f переменные, список которых обозначен многоточием (), в формате, указанном строкой fmt. Возвращает число записанных значений.

Прототип функции printf:

int printf (const char *fmt, );

Функция выводит на стандартное устройство вывода (stdout) значенияпеременных, перечисленных в списке, обозначенном многоточием (), в формате, определенном строкой fmt. Возвращает число выведенных значений.

Прототип функции sprintf:

int sprintf (char *buf, const char *fmt, );

Функция выводит в строку значения переменных, перечисленных в списке, обозначенном многоточием (), в формате, определенном строкой fmt.

Примечание. Спецификации формата fmt были рассмотрены в разделе "Консольный ввод-вывод".

 

1.4. Обработка ошибок

 

Функции работы с потоками возвращают значения, которые рекомендуется анализировать в программе и обрабатывать ошибочные ситуации, возникающие, например, при открытии файлов или чтении из потока. При работе с файлами часто используют функции feof и ferror.

Прототип функции feof:

int feof (FILE *f);

Функция возвращает EOF или значение, отличное от 0, если достигается конец файла; в противном случае 0.

Прототип функции ferror:

int ferror (FILE *f);

Возвращает не равное нулю целое значение, означающее код ошибки, если обнаружена ошибка ввода/вывода; 0 – в противном случае.


 

1.5. Пример обработки текстового файла

 

В текстовом файле "dbase.txt" хранятся данные о сотрудниках фирмы. В каждой строке файла указана фамилия, год рождения, оклад сотрудника. Для простоты обработки файла данные записаны единообразно: первые 15 символов занимает фамилия, следующие 5 – год рождения, последние 10 – оклад.

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

Структура записи файла изображена на рисунке.

 

Фамилия Год рожден. Оклад

Записи файла могут иметь вид:

 

Иванов И.П. 1982 453120

Авчинникова 1999 578320

Васильков 1955 456780