Читайте также:
|
|
Каждый спецификатор формата ввода начинается со знака %, причем спецификаторы формата ввода сообщают функции 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.
Использование feof()
Как уже говорилось, если достигнут конец файла, то getc() возвращает EOF. Однако проверка значения, возвращенного getc(), возможно, не является наилучшим способом узнать, достигнут ли конец файла. Во-первых, файловая система языка С может работать как с текстовыми, так и с двоичными файлами. Когда файл открывается для двоичного ввода, то может быть прочитано целое значение, которое, как выяснится при проверке, равняется EOF. В таком случае программа ввода сообщит о том, что достигнут конец файла, чего на самом деле может и не быть. Во-вторых, функция getc() возвращает EOF и в случае отказа, а не только тогда, когда достигнут конец файла. Если использовать только возвращаемое значение getc(), то невозможно определить, что же на самом деле произошло. Для решения этой проблемы в С имеется функция feof(), которая определяет, достигнут ли конец файла. Прототип функции feof() такой:
int feof(FILE * уф);
Если достигнут конец файла, то feof() возвращает true (истина); в противном же случае эта функция возвращает нуль.
Функция ferror()
Функция ferror() определяет, произошла ли ошибка во время выполнения операции с файлом. Прототип этой функции следующий:
int ferror(FILE * уф);
где уф — допустимый указатель файла. Она возвращает значение true (истина), если при последней операции с файлом произошла ошибка; в противном же случае она возвращает false (ложь). Так как при любой операции с файлом устанавливается свое условие ошибки, то после каждой такой операции следует сразу вызывать ferror(), а иначе данные об ошибке могут быть потеряны.
Дата добавления: 2015-02-16; просмотров: 89 | Поможем написать вашу работу | Нарушение авторских прав |