Слайд 2Понятие файла в языке Си
Файл - это упорядоченная последовательность однотипных компонентов,
расположенных на внешнем носителе.
Файлы предназначены только для хранения информации, а обработка этой информации осуществляется программами.
Использование файлов целесообразно в случае:
долговременного хранения данных;
доступа различных программ к одним и тем же данным;
обработки больших массивов данных, которые невозможно целиком разместить в оперативной памяти компьютера.
Файл, не содержащий ни одного элемента, называется пустым.
Создается файл путем добавления новых записей в конец первоначально пустого файла.
Длина файла, т.е. количество элементов, не задается при определении файла.
В языке Си отсутствуют операторы для работы с файлами. Все необходимые действия выполняются с помощью функций, включенных в стандартную библиотеку ввода-вывода языка Си (stdio.h - standart input output).
Слайд 3Буферизация ввода-вывода
Считываемая и записываемая информация представляет собой последовательность байтов - "поток"
(stream).
Поток – это логическое устройство, являющееся источником или получателем данных.
В зависимости от того, откуда поступает считываемая информация или куда направляется записываемая информация, поток связывается с соответствующим устройством ввода вывода (клавиатура, дисплей, принтер и т.п.) или с именованной областью внешней памяти – файлом, если требуется долговременно хранить информацию либо получить доступ к хранимой информации.
При организации ввода-вывода в С используется буферизация, то есть обмен информацией между программой и внешним устройством происходит не непосредственно, а через буфер – специально выделяемую системой область оперативной памяти.
Буферизация ускоряет работу программы из-за уменьшения количества обращений к внешним устройствам.
В библиотеке описана константа BUFSIZE, величина которой 512:
#define BUFSIZE 512
Для изменения размера буфера предназначены функции setbuf() или setvbuf().
Слайд 4Текстовый и бинарный режим работы с файлами
Библиотека stdio.h поддерживает текстовые и
бинарные (двоичные) потоки.
Текстовый поток – это последовательность строк, каждая из которых заканчивается символом ‘\n’. Операционная среда может потребовать коррекции текстового потока. Например, при вводе текстового потока система преобразует символы возврат каретки 0x13 и перевод строки 0x10 в одиночный символ ‘\n’. При обнаружении в текстовом файле символа с кодом 26 (0x26), т.е. признака конца файла, чтение файла в текстовом режиме заканчивается, хотя файл может иметь продолжение. При выводе текстового потока в среду операционной системы происходит обратное преобразование.
Бинарный поток – это последовательность не преобразуемых байтов, представляющих собой некоторые промежуточные данные, которые обладают тем свойством, что если их записать, а затем прочесть той же системой ввода-вывода, то будет получена информация, совпадающая с исходной.
Слайд 5Функция 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 на диске с: .
“Способ использования файла” - определяет режим открытия файла.
Слайд 6Режимы открытия файла.
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+.
Слайд 7Примеры открытия файлов
FILE *f_in, *f_out;
f_in = fopen ("My_file1","r");
f_out = fopen ("My_file2","w");
Слайд 8Функция fclose
После окончания работы с файлом он должен быть закрыт. Закрытие
файла (текстового или бинарного) выполняется функцией fclose():
fclose(FILE *fp);
При этом разрывается связь указателя на файл c внешним набором данных. Освободившийся указатель можно использовать для другого файла.
При успешном завершении операции функция fclose( ) возвращает значение нуль. Любое другое значение свидетельствует об ошибке.
Пример:
fclose(f_in);
Слайд 9Проверка признака конца файла
При каждой операции ввода/вывода происходит перемещение указателя текущей
позиции в файле, в какой-то момент указатель достигает конца файла. Структура типа FILE имеет поле – индикатор конца файла. Функция feof() проверяет состояние индикатора конца файла и возвращает значение 0, если конец файла не был достигнут, или значение, отличное от нуля, если был достигнут конец файла. Функция имеет единственный аргумент – указатель на поток типа FILE.
Вызов функции:
if (! feof(f_in))…
проверяет, что конец файла еще не достигнут.
Слайд 10Функции ввода/вывода. Функции fgetc() и fputc().
Простейший способ выполнить чтение из файла или запись в
файл – использовать функции getc() или putc().
Функция getc() выбирает из файла очередной символ; ей нужно только знать указатель на файл:
char Symb = getc(f_in);
Если при обработке достигается конец файла, то функция getc() возвращает значение EOF(end of file).
Функция putc() заносит значение символа Symb в файл, на который указывает f_out. Формат вызова функции:
putc(Symb,f_out);
Слайд 11Функции 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(ptr);
}
fclose(ptr);
}
еlse printf("\nFile not found!");
return 0;
}
В этом примере для чтения из файла используется переменная ptr. При открытии файла производится проверка. Если переменной ptr присвоено значение NULL, то файл не найден; на экран выводится соответствующее сообщение, и программа завершается. Если ptr получила ненулевое значение, то файл открыт. Далее выполняется чтение символов из файла до тех пор, пока не будет достигнут конец файла (!feof(ptr)). Прочитанные символы помещаются в переменную ch, а затем выводятся на экран.
Слайд 12Функции getc() и putc().
Пример 2. Записать в файл буквы, вводимые с клавиатуры.
Ввод продолжается до нажатия
клавиши F6 или 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;
}
Слайд 13Функции fscanf() и fprintf()
Функции fscanf() и fprintf() выполняют форматированный ввод/вывод.
Чтение из файла выполняет функция fscanf():
fscanf(f_in,[строка формата],[список адресов переменных]);
Функция возвращает количество введенных значений или EOF.
Запись в
файл осуществляет функция fprintf():
fprintf(f_out,[строка формата],[список переменных, констант]);
Функция возвращает количество выведенных байт (символов) или EOF.
Строка формата функций fscanf() и fprintf() формируется так же, как
при консольном вводе/выводе функциями printf() и scanf().
Следует заметить, что вызов функции
fscanf(stdin,[строка формата],[список адресов переменных]);
эквивалентен вызову
scanf([строка формата],[список адресов переменных]);
Аналогично,
fprintf(stdout, [строка формата],[список переменных, констант]);
эквивалентно
printf([строка формата],[список переменных, констант]);
Слайд 14 Примеры программ, использующих
функции fscanf() и fprintf().
Пример 1. В программе создается массив, состоящий
из четырех целых чисел. Вывести массив в файл:
#include
#define n 4
int main() {
int i=0;
int array[n]={4,44,446,4466};
FILE *out;
out=fopen("num_arr.txt","w");
for(;ifprintf(out,"%6d",array[i]);
fclose(out);
return 0; }
В результате выполнения программы в файл num_arr.txt будет помещена
следующая информация:
Слайд 15 Примеры программ, использующих
функции fscanf() и fprintf().
#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);
S+=numb;
count++;
printf("%d\n", numb);
}
double
aver=(double)S/count;
printf("Average=%f\n", aver);
fclose(in);
}
else
printf("\nФайл не найден!");
return 0; }
Пример 2. Имеется файл данных, содержащий целые числа, разделенные пробелами. Количество чисел в файле неизвестно. Требуется найти среднее арифметическое значение этих чисел.
Чтение чисел из файла выполняется в переменную numb до тех пор, пока не будет достигнут конец файла. Одновременно ведется подсчет количества прочитанных символов в переменной count и накопление суммы прочитанных чисел в переменной S. Переменные S и count целые, поэтому для правильного вычисления среднего арифметического, необходимо выполнить преобразование одной из этих переменных в формат double.
Слайд 16Примеры программ, использующих
функции 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 %s\n", 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 %s\n", bal, name);
оператор записывает данные в файл.
Принцип действия тот же, какой и у оператора printf, только тут
в начале указывается указатель на файл , в который будет производится запись данных.
fclose(file);
раз данные мы записали и файл нам больше не нужен,
то смело может закрывать его, тем самым освобождая ресурсы.
Слайд 17Задание
Создайте 10 записей, содержащих
информацию о железнодорожных
маршрутах. В нём должны
быть следующие
данные:
номер пути
номер вагона
имя поезда
Запишите сами вручную эти данные в файл.
Затем вам необходимо считать эти данные и
вывести их на экран.