
Лекция 5 Файлы в Си.pptx
- Количество слайдов: 17
Лекция 5 Файлы в Си
Понятие файла в языке Си Файл - это упорядоченная последовательность однотипных компонентов, расположенных на внешнем носителе. Файлы предназначены только для хранения информации, а обработка этой информации осуществляется программами. Использование файлов целесообразно в случае: q долговременного хранения данных; q доступа различных программ к одним и тем же данным; q обработки больших массивов данных, которые невозможно целиком разместить в оперативной памяти компьютера. Файл, не содержащий ни одного элемента, называется пустым. Создается файл путем добавления новых записей в конец первоначально пустого файла. Длина файла, т. е. количество элементов, не задается при определении файла. В языке Си отсутствуют операторы для работы с файлами. Все необходимые действия выполняются с помощью функций, включенных в стандартную библиотеку ввода-вывода языка Си (stdio. h - standart input output).
Буферизация ввода-вывода Считываемая и записываемая информация представляет собой последовательность байтов - "поток" (stream). Поток – это логическое устройство, являющееся источником или получателем данных. В зависимости от того, откуда поступает считываемая информация или куда направляется записываемая информация, поток связывается с соответствующим устройством ввода вывода (клавиатура, дисплей, принтер и т. п. ) или с именованной областью внешней памяти – файлом, если требуется долговременно хранить информацию либо получить доступ к хранимой информации. При организации ввода-вывода в С используется буферизация, то есть обмен информацией между программой и внешним устройством происходит не непосредственно, а через буфер – специально выделяемую системой область оперативной памяти. Буферизация ускоряет работу программы из-за уменьшения количества обращений к внешним устройствам. В описана константа BUFSIZE, величина которой 512: #define BUFSIZE 512 Для изменения размера буфера предназначены функции setbuf() или setvbuf().
Текстовый и бинарный режим работы с файлами Библиотека stdio. h поддерживает текстовые и бинарные (двоичные) потоки. Текстовый поток – это последовательность строк, каждая из которых заканчивается символом ‘n’. Операционная среда может потребовать коррекции текстового потока. Например, при вводе текстового потока система преобразует символы возврат каретки 0 x 13 и перевод строки 0 x 10 в одиночный символ ‘n’. При обнаружении в текстовом файле символа с кодом 26 (0 x 26), т. е. признака конца файла, чтение файла в текстовом режиме заканчивается, хотя файл может иметь продолжение. При выводе текстового потока в среду операционной системы происходит обратное преобразование. Бинарный поток – это последовательность не преобразуемых байтов, представляющих собой некоторые промежуточные данные, которые обладают тем свойством, что если их записать, а затем прочесть той же системой ввода-вывода, то будет получена информация, совпадающая с исходной.
Функция fopen Прежде чем читать или записывать информацию в файл, он должен быть открыт функцией fopen и тем самым связан с потоком ввода-вывода. Функция открытия потока возвращает указатель fp на предопределенную в библиотеке stdio. h структуру типа FILE (содержащую всю необходимую для работы с потоком информацию) при успешном открытии потока, или NULL в противном случае. В stdio. h заданы 3 предопределенныч потока : stdin (стандартный поток ввода), stdout (стандартный поток вывода), stderr (стандартный поток ошибок) • Вывод данных через stdout и stderr по умолчанию осуществляется на консоль. Ввод данных через stdin по умолчнию осуществляется через клавиатуру. • Предопределенные потоки всегда открыты. При открытии файла указатель на файл связывается с конкретным файлом на диске (Если файл не может быть открыт по какой-либо причине, функция возвращает NULL. ) : FILE *fp; fp = fopen(“спецификация файла”, "способ использования файла"); “Спецификация файла” (т. е. имя файла и путь к нему) может, например, иметь вид: "c: \my_prog. txt" - для файла my_prog. txt на диске с: . “Способ использования файла” - определяет режим открытия файла.
Режимы открытия файла. r - открыть существующий файл для чтения; w - создать новый файл для записи (если файл с указанным именем существует, то он будет переписан); а - дополнить файл (открыть существующий файл для записи информации, начиная с конца файла, или создать файл, если он не существует); r+ - открыть существующий файл для чтения и записи; w+ - создать новый файл для чтения и записи; a+ - дополнить или создать файл с возможностью чтения и записи; rb - открыть двоичный файл для чтения; wb - создать двоичный файл для записи; аb - дополнить двоичный файл; r+b - открыть двоичный файл для чтения и записи; w+b - создать двоичный файл для чтения и записи; а+b - дополнить двоичный файл с предоставлением возможности чтения и записи; rt - открыть текстовой файл для чтения; wt - создать текстовый файл для записи; at - дополнить текстовый файл; r+t - открыть текстовой файл для чтения и записи; w+t - создать текстовый файл для чтения и записи; a+t - дополнить текстовый файл с предоставлением возможности записи и чтения. Строки вида r+b можно записывать и в другой форме: rb+.
Функция fclose После окончания работы с файлом он должен быть закрыт. Закрытие файла (текстового или бинарного) выполняется функцией fclose(): fclose(FILE *fp); При этом разрывается связь указателя на файл c внешним набором данных. Освободившийся указатель можно использовать для другого файла. При успешном завершении операции функция fclose( ) возвращает значение нуль. Любое другое значение свидетельствует об ошибке. Пример: fclose(f_in);
Проверка признака конца файла При каждой операции ввода/вывода происходит перемещение указателя текущей позиции в файле, в какой-то момент указатель достигает конца файла. Структура типа FILE имеет поле – индикатор конца файла. Функция feof() проверяет состояние индикатора конца файла и возвращает значение 0, если конец файла не был достигнут, или значение, отличное от нуля, если был достигнут конец файла. Функция имеет единственный аргумент – указатель на поток типа FILE. Вызов функции: if (! feof(f_in))… проверяет, что конец файла еще не достигнут.
Функции ввода/вывода. Функции fgetc() и fputc(). Простейший способ выполнить чтение из файла или запись в файл – использовать функции getc() или putc(). Функция getc() выбирает из файла очередной символ; ей нужно только знать указатель на файл: char Symb = getc(f_in); Если при обработке достигается конец файла, то функция getc() возвращает значение EOF(end of file). Функция putc() заносит значение символа Symb в файл, на который указывает f_out. Формат вызова функции: putc(Symb, f_out);
Функции fgetc() и fputc(). Пример 1. Текст из файла my_char. txt выводится на экран. Если файл не найден, на экран выводится сообщение "File not found!": #include
Функции getc() и putc(). Пример 2. Записать в файл буквы, вводимые с клавиатуры. Ввод продолжается до нажатия клавиши F 6 или CTRL/z (ввод символа EOF – конца файла): #include
Функции fscanf() и fprintf() выполняют форматированный ввод/вывод. Чтение из файла выполняет функция fscanf(): fscanf(f_in, [строка формата], [список адресов переменных]); Функция возвращает количество введенных значений или EOF. Запись в файл осуществляет функция fprintf(): fprintf(f_out, [строка формата], [список переменных, констант]); Функция возвращает количество выведенных байт (символов) или EOF. Строка формата функций fscanf() и fprintf() формируется так же, как при консольном вводе/выводе функциями printf() и scanf(). Следует заметить, что вызов функции fscanf(stdin, [строка формата], [список адресов переменных]); эквивалентен вызову scanf([строка формата], [список адресов переменных]); Аналогично, fprintf(stdout, [строка формата], [список переменных, констант]); эквивалентно printf([строка формата], [список переменных, констант]);
Примеры программ, использующих функции fscanf() и fprintf(). Пример 1. В программе создается массив, состоящий из четырех целых чисел. Вывести массив в файл: #include
Примеры программ, использующих функции fscanf() и fprintf(). Пример 2. Имеется файл данных, содержащий целые числа, разделенные пробелами. Количество чисел в файле неизвестно. Требуется найти среднее арифметическое значение этих чисел. #include
Примеры программ, использующих функции fscanf() и fprintf(). #include
Задание Создайте 10 записей, содержащих информацию о железнодорожных маршрутах. В нём должны быть следующие данные: o номер пути o номер вагона o имя поезда Запишите сами вручную эти данные в файл. Затем вам необходимо считать эти данные и вывести их на экран.