Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Файловая система языка Си.doc
Скачиваний:
14
Добавлен:
12.09.2019
Размер:
99.33 Кб
Скачать

Int scanf(const char *управляющая_строка, ...);

Эта функция возвращает количество тех элементов данных, которым было успешно присвоено значение. В случае ошибки scanf() возвращает EOF, управляющая_строка определяет преобразование считываемых значений при записи их переменные, на которые указывают элементы списка аргументов.

Управляющая строка состоит из символов трех видов: спецификаторов преобразования, разделителей, символов, не являющихся разделителями.

Теперь поговорим о каждом из этих видов.

Спецификаторы преобразования

Каждый спецификатор формата ввода начинается со знака %, причем спецификаторы формата ввода сообщают функции scanf() тип считываемых данных. Спецификаторам преобразования в порядке слева направо ставятся в соответствие элементы списка аргументов. Рассмотрим некоторые примеры.

Спецификаторы преобразования для функции scanf()

Код

Значение

%a

Читает значение с плавающей точкой (только С99)

%c

Читает одиночный символ

%d

Читает десятичное целое число

%i

Читает целое число как в десятичном, так и восьмеричном или шестнадцатеричном формате

%e

Читает число с плавающей точкой

%f

Читает число с плавающей точкой

%g

Читает число с плавающей точкой

Читает восьмеричное число

%s

Читает строку

%x

Читает шестнадцатеричное число

%p

Читает указатель

%n

Принимает целое значение, равное количеству уже считанных символов

%u

Читает десятичное целое число без знака

%[]

Читает набор сканируемых символов

%%

Читает знак процента

Функции fprinf() и fscanf()

В системе ввода/вывода языка С также имеются функции fprintf() и fscanf(). Эти две функции, за исключением того, что предназначены для работы с файлами, ведут себя точно так же, как и printf() и scanf(). Прототипы функций fprintf() и fscanf() следующие:

int fprintf(FILE *уф, const char *управляющая_строка, ...);

int fscanf(FILE *уф, const char *управляющая_строка, ...);

где уф — указатель файла, возвращаемый в результате вызова fopen(). Операции ввода/вывода функции fprintf() и fscanf() выполняют с тем файлом, на который указывает уф.

Функции fread() и fwrite()

Для чтения и записи данных, тип которых может занимать более 1 байта, в файловой системе языка С имеется две функции: fread() и fwrite(). Эти функции позволяют читать и записывать блоки данных любого типа. Их прототипы следующие:

size_t fread(void *буфер, size_t колич_байт, size_t счетчик, FILE *уф);

size_t fwrite(const void *буфер, size_t колич_байт, size_t счетчик, FILE *уф);

Для fread() буфер — это указатель на область памяти, в которую будут прочитаны данные из файла. А для fwrite() буфер — это указатель на данные, которые будут записаны в файл. Значение счетчик определяет, сколько считывается или записывается элементов данных, причем длина каждого элемента в байтах равна колич_байт. (Вспомните, что тип size_t определяется как одна из разновидностей целого типа без знака.) И, наконец, уф — это указатель файла, то есть на уже открытый поток.

Функция fread() возвращает количество прочитанных элементов. Если достигнут конец файла или произошла ошибка, то возвращаемое значение может быть меньше, чем счетчик. А функция fwrite() возвращает количество записанных элементов. Если ошибка не произошла, то возвращаемый результат будет равен значению счетчик.

Функция rewind()

Функция rewind() устанавливает указатель текущей позиции в файле на начало файла, указанного в качестве аргумента этой функции. Иными словами, функция rewind() выполняет "перемотку" (rewind) файла. Вот ее прототип:

void rewind(FILE *уф);

где уф — это допустимый указатель файла.

Ввод / вывод при прямом доступе: функция fseek()

При прямом доступе можно выполнять операции ввода/вывода, используя систему ввода/вывода языка С и функцию fseek(), которая устанавливает указатель текущей позиции в файле. Вот прототип этой функции:

int fseek(FILE *уф, long int колич_байт, int начало_отсчета);

Здесь уф — это указатель файла, возвращаемый в результате вызова функции fopen(), колич_байт — количество байтов, считая от начало_отсчета, оно определяет новое значение указателя текущей позиции, а начало отсчёта — это один из следующих макросов:

Начало отсчета Макрос

Начало файла SEEK_SET

Текущая позиция SEEK_CUR

Конец файла SEEK_END

Поэтому, чтобы получить в файле доступ на расстоянии колич_байт байтов от начала файла, начало_отсчета должно равняться SEEK_SET. Чтобы при доступе расстояние отсчитывалось от текущей позиции, используйте макрос SEEK_CUR, а чтобы при доступе расстояние отсчитывалось от конца файла, нужно указывать макрос SEEK_END. При успешном завершении своей работы функция fseek() возвращает нуль, а в случае ошибки — ненулевое значение.

Текущее значение указателя текущей позиции в файле можно определить с помощью функции ftell(). Вот ее прототип:

long int ftell(FILE *уф);

Функция возвращает текущее значение указателя текущей позиции в файле, связанном с указателем файла уф. При неудачном исходе она возвращает -1.