Скачать презентацию Лекция 5 Файлы в Си Понятие файла Скачать презентацию Лекция 5 Файлы в Си Понятие файла

Лекция 5 Файлы в Си.pptx

  • Количество слайдов: 17

Лекция 5 Файлы в Си Лекция 5 Файлы в Си

Понятие файла в языке Си Файл - это упорядоченная последовательность однотипных компонентов, расположенных на Понятие файла в языке Си Файл - это упорядоченная последовательность однотипных компонентов, расположенных на внешнем носителе. Файлы предназначены только для хранения информации, а обработка этой информации осуществляется программами. Использование файлов целесообразно в случае: q долговременного хранения данных; q доступа различных программ к одним и тем же данным; q обработки больших массивов данных, которые невозможно целиком разместить в оперативной памяти компьютера. Файл, не содержащий ни одного элемента, называется пустым. Создается файл путем добавления новых записей в конец первоначально пустого файла. Длина файла, т. е. количество элементов, не задается при определении файла. В языке Си отсутствуют операторы для работы с файлами. Все необходимые действия выполняются с помощью функций, включенных в стандартную библиотеку ввода-вывода языка Си (stdio. h - standart input output).

Буферизация ввода-вывода Считываемая и записываемая информация представляет собой последовательность байтов - Буферизация ввода-вывода Считываемая и записываемая информация представляет собой последовательность байтов - "поток" (stream). Поток – это логическое устройство, являющееся источником или получателем данных. В зависимости от того, откуда поступает считываемая информация или куда направляется записываемая информация, поток связывается с соответствующим устройством ввода вывода (клавиатура, дисплей, принтер и т. п. ) или с именованной областью внешней памяти – файлом, если требуется долговременно хранить информацию либо получить доступ к хранимой информации. При организации ввода-вывода в С используется буферизация, то есть обмен информацией между программой и внешним устройством происходит не непосредственно, а через буфер – специально выделяемую системой область оперативной памяти. Буферизация ускоряет работу программы из-за уменьшения количества обращений к внешним устройствам. В описана константа BUFSIZE, величина которой 512: #define BUFSIZE 512 Для изменения размера буфера предназначены функции setbuf() или setvbuf().

Текстовый и бинарный режим работы с файлами Библиотека stdio. h поддерживает текстовые и бинарные Текстовый и бинарный режим работы с файлами Библиотека stdio. h поддерживает текстовые и бинарные (двоичные) потоки. Текстовый поток – это последовательность строк, каждая из которых заканчивается символом ‘n’. Операционная среда может потребовать коррекции текстового потока. Например, при вводе текстового потока система преобразует символы возврат каретки 0 x 13 и перевод строки 0 x 10 в одиночный символ ‘n’. При обнаружении в текстовом файле символа с кодом 26 (0 x 26), т. е. признака конца файла, чтение файла в текстовом режиме заканчивается, хотя файл может иметь продолжение. При выводе текстового потока в среду операционной системы происходит обратное преобразование. Бинарный поток – это последовательность не преобразуемых байтов, представляющих собой некоторые промежуточные данные, которые обладают тем свойством, что если их записать, а затем прочесть той же системой ввода-вывода, то будет получена информация, совпадающая с исходной.

Функция fopen Прежде чем читать или записывать информацию в файл, он должен быть открыт Функция 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 - создать новый файл для записи (если файл с указанным именем существует, то он будет переписан); а - дополнить файл (открыть существующий файл для записи информации, начиная с конца файла, или создать файл, если он не существует); r+ - открыть существующий файл для чтения и записи; w+ - создать новый файл для чтения и записи; a+ - дополнить или создать файл с возможностью чтения и записи; rb - открыть двоичный файл для чтения; wb - создать двоичный файл для записи; аb - дополнить двоичный файл; r+b - открыть двоичный файл для чтения и записи; w+b - создать двоичный файл для чтения и записи; а+b - дополнить двоичный файл с предоставлением возможности чтения и записи; rt - открыть текстовой файл для чтения; wt - создать текстовый файл для записи; at - дополнить текстовый файл; r+t - открыть текстовой файл для чтения и записи; w+t - создать текстовый файл для чтения и записи; a+t - дополнить текстовый файл с предоставлением возможности записи и чтения. Строки вида r+b можно записывать и в другой форме: rb+.

Примеры открытия файлов FILE *f_in, *f_out; f_in = fopen (

Функция fclose После окончания работы с файлом он должен быть закрыт. Закрытие файла (текстового Функция fclose После окончания работы с файлом он должен быть закрыт. Закрытие файла (текстового или бинарного) выполняется функцией fclose(): fclose(FILE *fp); При этом разрывается связь указателя на файл c внешним набором данных. Освободившийся указатель можно использовать для другого файла. При успешном завершении операции функция fclose( ) возвращает значение нуль. Любое другое значение свидетельствует об ошибке. Пример: fclose(f_in);

Проверка признака конца файла При каждой операции ввода/вывода происходит перемещение указателя текущей позиции в Проверка признака конца файла При каждой операции ввода/вывода происходит перемещение указателя текущей позиции в файле, в какой-то момент указатель достигает конца файла. Структура типа FILE имеет поле – индикатор конца файла. Функция feof() проверяет состояние индикатора конца файла и возвращает значение 0, если конец файла не был достигнут, или значение, отличное от нуля, если был достигнут конец файла. Функция имеет единственный аргумент – указатель на поток типа FILE. Вызов функции: if (! feof(f_in))… проверяет, что конец файла еще не достигнут.

Функции ввода/вывода. Функции fgetc() и fputc(). Простейший способ выполнить чтение из файла или запись Функции ввода/вывода. Функции 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 выводится на экран. Функции fgetc() и fputc(). Пример 1. Текст из файла my_char. txt выводится на экран. Если файл не найден, на экран выводится сообщение "File not found!": #include int main(void) { FILE *ptr; unsigned char ch; if ((ptr=fopen("my_char. txt", "r"))!=NULL) { ch=fgetc(ptr); while (!feof(ptr)) { printf("%c", ch); ch=fgetc(prt); } fclose(ptr); } еlse printf("n. File not found!"); return 0; } В этом примере для чтения из файла используется переменная ptr. При открытии файла производится проверка. Если переменной ptr присвоено значение NULL, то файл не найден; на экран выводится соответствующее сообщение, и программа завершается. Если ptr получила ненулевое значение, то файл открыт. Далее выполняется чтение символов из файла до тех пор, пока не будет достигнут конец файла (!feof(ptr)). Прочитанные символы помещаются в переменную ch, а затем выводятся на экран.

Функции getc() и putc(). Пример 2. Записать в файл буквы, вводимые с клавиатуры. Ввод Функции getc() и putc(). Пример 2. Записать в файл буквы, вводимые с клавиатуры. Ввод продолжается до нажатия клавиши F 6 или CTRL/z (ввод символа EOF – конца файла): #include int main(void) { char c; FILE *out; out=fopen("Liter", "w"); while ((c=getch( ) )!=EOF) fputc(c, out); fclose(out); return 0; }

Функции fscanf() и fprintf() выполняют форматированный ввод/вывод. Чтение из файла выполняет функция fscanf(): fscanf(f_in, Функции 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. В программе создается массив, Примеры программ, использующих функции fscanf() и fprintf(). Пример 1. В программе создается массив, состоящий из четырех целых чисел. Вывести массив в файл: #include #define n 4 int main() { int i=0; int array[n]={4, 446, 4466}; FILE *out; out=fopen("num_arr. txt", "w"); for(; i

 Примеры программ, использующих функции fscanf() и fprintf(). Пример 2. Имеется файл данных, содержащий Примеры программ, использующих функции fscanf() и fprintf(). Пример 2. Имеется файл данных, содержащий целые числа, разделенные пробелами. Количество чисел в файле неизвестно. Требуется найти среднее арифметическое значение этих чисел. #include int main() { int S=0, count=0, numb; FILE *in; if ((in=fopen("num_arr. txt", "r"))!=NULL) { while (!feof(in)) { Чтение чисел из файла выполняется в fscanf(in, "%d", &numb); переменную numb до тех пор, пока не будет S+=numb; count++; достигнут конец файла. Одновременно printf("%dn", numb); ведется подсчет количества прочитанных } символов в переменной count и накопление double aver=(double)S/count; суммы прочитанных чисел в переменной S. printf("Average=%fn", aver); Переменные S и count целые, поэтому для fclose(in); правильного вычисления среднего } арифметического, необходимо выполнить else преобразование одной из этих переменных printf("n. Файл не найден!"); в формат double. return 0; }

Примеры программ, использующих функции fscanf() и fprintf(). #include <conio. h> #include <stdio. h> int Примеры программ, использующих функции fscanf() и fprintf(). #include #include int main() { int bal; char name[15]; FILE *file; if ((file = fopen("1. txt", "w")) == NULL) printf("Файл невозможно открыть или создатьn"); else{ for(; ; ){ scanf ("%d%s", &bal, name); if (bal == 0) break; fprintf(file, "%d %sn", bal, name); } } fclose(file); return 0; } Пример 3. Ввод имени и балла. FILE *file; объявляем указатель на структуру File ( дескриптор файла ). if ((file = fopen("1. txt", "w")) == NULL) функция fopen принимает два параметра. Первый - это имя файла, второй - режим работы с файлом, в котором он будет открыт. В нашем режиме, если файл не существует, то он создается, а если файл уже был, то его содержимое полностью стирается. Эта функция возвращает указатель на структуру FILE , т. е. теперь мы сможем управлять созданным файлом при помощи нашего указателя file. Оператор if тут используется, так как идет проверка указателя на NULL, а NULL может быть, только если файл мы не смогли открыть. fprintf(file, "%d %sn", bal, name); оператор записывает данные в файл. Принцип действия тот же, какой и у оператора printf, только тут в начале указывается указатель на файл , в который будет производится запись данных. fclose(file); раз данные мы записали и файл нам больше не нужен, то смело может закрывать его, тем самым освобождая ресурсы.

Задание Создайте 10 записей, содержащих информацию о железнодорожных маршрутах. В нём должны быть следующие Задание Создайте 10 записей, содержащих информацию о железнодорожных маршрутах. В нём должны быть следующие данные: o номер пути o номер вагона o имя поезда Запишите сами вручную эти данные в файл. Затем вам необходимо считать эти данные и вывести их на экран.