
- •Потоки и файлы
- •Текстовые потоки
- •Стандартные потоки
- •Связь с консольным вводом / выводом
- •Ввод / вывод на консоль
- •Основы файловой системы
- •Указатель файла
- •Открытие файла
- •Допустимые значения режим
- •Перенаправление стандартных потоков: функция freopen()
- •Закрытие файла
- •Чтение и запись символов(стандартные потоки)
- •Трудности использования getchar()
- •Запись символа
- •Чтение символа
- •Чтение и запись строк (стандартные потоки)
- •Ввод / вывод строк: fputs() и fgets()
- •Int printf(const char *управляющая_строка, ...);
- •Спецификаторы преобразования для функции printf()
- •Int scanf(const char *управляющая_строка, ...);
- •Спецификаторы преобразования
- •Спецификаторы преобразования для функции scanf()
- •Использование feof()
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.