Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Работа с файлами






Во время работы программа может обмениваться данными с какими-либо внешними устройствами: клавиатурой, монитором, жестким диском и т. д. Для такого обмена данными используется понятие файл [7].

Файл – это информация, размещенная на каком-либо носителе (диске) или в буфере ввода/вывода устройства (клавиатура). Для обмена данными файл должен быть открыт, по завершении этого процесса – закрыт.

Поток – это логический канал, предназначенный для выполнения операций ввода/вывода. Каждому файлу при его открытии ставится в соответствие поток.

В языке C существуют стандартные потоки:

stdin – стандартный консольный ввод (клавиатура по умолчанию);

stdout – стандартный консольный вывод (монитор по умолчанию);

Стандартные потоки открываются при каждом запуске программы.

Для работы с файлами в программах на C используется заголовочный файл stdio.h, в котором объявлен специальный тип данных – структура FILE, предназначенная для хранения атрибутов (параметров) файлов (указатель текущей позиции файла, признак конца файла, флаги индикации ошибок, сведения о буферизации и др.).

Поля структуры типа FILE доступны с помощью специальных
C-функций. Для организации работы с файлом используется определенная последовательность действий.

Объявление потока – переменной-указателя на структуру типа FILE, в которой будут храниться атрибуты файла

FILE *fl,

где *fl указатель на файл.

Открытие файла

fl=fopen(" путь к файлу", " режим работы файла");

Параметр " путь к файлу" указывает размещение файла на диске и обязательно содержит имя файла и может содержать имя логического диска и путь.

Параметр " режим работы файла" показывает, как будет использоваться файл:

" w" – для записи данных (вывод);

" r" – для чтения данных (ввод);

" a" – для добавления данных к существующим записям.

Примеры открытия файлов:

FILE *f_in, *_out;

f_in=fopen(" My_file1", " r");

f_out=fopen(" My_file2", " w");

Функция fopen() возвращает значение указателя на структуру типа файл. Если файл по каким-либо причинам не открывается, функция fopen() возвращает значение NULL.

Рассмотрим особенности режимов открытия файлов. Если файл открывается в режиме записи данных " w", то указатель текущей позиции устанавливается на начало файла. Если указанный в функции fopen() файл не существует, то он создается. Необходимо помнить, что открытие существующего файла в режиме " w" приводит к уничтожению его старого содержания.

Открытие файла для чтения в режиме " r" возможно только для созданного ранее файла, при этом указатель текущей позиции устанавливается на начало файла. Если открываемый на чтение файл не существует, функция fopen() возвращает пустой указатель со значением NULL.

Если файл открывается в режиме добавления данных " a", то указатель текущей позиции устанавливается на конец файла. Данные, ранее помещенные в файл, остаются без изменений. Если указывается несуществующий файл, то он создается заново.

Также можно указать дополнительные условия режима открытия файла:

" b" – двоичный поток;

" t" – текстовый поток;

" +" – обновление файла.

Пример

" r+" – чтение файла с обновлением, т. е. возможна перезапись данных с усечением;

" w+" – запись в файл и одновременно чтение;

" a+" – добавление данных и чтение.

Для поочередного выполнения чтения и записи в режиме " +" необходимо ручное позиционирование курсора.

Обработка открытого файла

Каким образом можно прочитать уже открытый файл или записать в него информацию? Для этого в языке C существуют специальные функции:

Чтение (ввод) Запись (вывод)
getc() putc()
fscanf() fprintf()
fgets() fputs()
fread() fwrite()

При каждой операции ввода/вывода указатель текущей позиции файла смещается на одну позицию в сторону конца файла.

Проверка признака конца файла

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

if (! feof(f_in))…

проверяет, что конец файла еще не достигнут.

Закрытие файла

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

fclose(f_in);

При нормальном завершении программы в большинстве операционных систем все открытые файлы закрываются автоматически, но рекомендуется закрывать все файлы, дальнейшая обработка которых в программе не предполагается, при помощи функции fclose().

 

 

13.2. Функции ввода/вывода

Простейший способ выполнить чтение из файла или запись в файл – использовать функции getc() или putc().

Функция getc() выбирает из файла очередной символ; ей нужно только знать указатель на файл, например, char Symb=getc(f_in);

Если при обработке достигается конец файла, то функция getc() возвращает значение EOF(end of file).

Функция putc() заносит значение символа Symb в файл, на который указывает f_out. Формат вызова функции: putc(Symb, f_out);

Пример 1. Текст из файла my_char.txtвыводится на экран. Если файл не найден, на экран выводится сообщение " File not found! ":

#include < stdio.h>

int main(void)

{

ch=getc(prt);

FILE *ptr;

unsigned char ch;

if ((ptr=fopen(" my_char.txt", " r"))! =NULL)

{

ch=getc(ptr);

while (! feof(ptr))

{

printf(" %c", ch);

ch=getc(prt);

}

fclose(ptr);

}

else printf(" \nFile not found! ");

return 0;

}

В этом примере для чтения из файла используется переменная ptr. При открытии файла производится проверка. Если переменной ptr присвоено значение NULL, то файл не найден; на экран выводится соответствующее сообщение, и программа завершается. Если ptr получила ненулевое значение, то файл открыт. Далее выполняется чтение символов из файла до тех пор, пока не будет достигнут конец файла (! feof(ptr)). Прочитанные символы помещаются в переменную ch, а затем выводятся на экран.

Пример 2. Записать в файл буквы, вводимые с клавиатуры. Ввод продолжается до нажатия клавиши F6 или CTRL/z (ввод символа EOF – конца файла):

#include < stdio.h>

int main(void)

{

char c;

FILE *out;

out=fopen(" Liter", " w");

while ((c=getchar())! =EOF)

fputc(c, out);

fclose(out);

return 0;

}

Функции fscanf() и fprintf() выполняют форматированный ввод/вывод. Чтение из файла выполняет функция fscanf():

fscanf(f_in, [строка формата], [список адресов переменных]);

Функция возвращает количество введенных значений или EOF.

Запись в файл осуществляет функция fprintf():

fprintf(f_out, [строка формата], [список переменных, констант]);

Возвращает количество выведенных байт (символов) или EOF.

Строка формата функций fscanf() и fprintf() формируется так же, как было описано ранее в гл. 5, посвященной консольному вводу/выводу и функциям printf() и scanf().

Следует заметить, что вызов функции

fscanf(stdin, [строка формата], [список адресов переменных]);

эквивалентен вызову

scanf([строка формата], [список адресов переменных]);

Аналогично,

fprintf(stdout, [строка формата], [список переменных, констант]);

эквивалентно

printf([строка формата], [список переменных, констант]);

Рассмотрим примеры программ, использующих эти функции.

Пример 3. В программе создается массив, состоящий из четырех целых чисел. Вывести массив в файл:

#include < stdio.h>

#define n 4

int main()

{

int i=0;

int array[n]={4, 44, 446, 4466};

FILE *out;

out=fopen(" num_arr.txt", " w");

for(; i< n; i++)

fprintf(out, " %6.2d", array[i]);

fclose(out);

return 0;

}

В результате выполнения программы в файл num_arr.txt будет помещена следующая информация:

                                               

Пример 4. Имеется файл данных, содержащий целые числа, разделенные пробелами. Количество чисел в файле неизвестно. Требуется найти среднее арифметическое значение этих чисел:

#include < stdio.h>

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=%lf\n", aver);

fclose(in);

}

else

printf(" \nФайл не найден! ");

return 0;

}

Чтение чисел из файла выполняется в переменную numb до тех пор, пока не будет достигнут конец файла. Одновременно ведется подсчет количества прочитанных символов в переменной count и накопление суммы прочитанных чисел в переменной S. Переменные S и count целые, поэтому для правильного вычисления среднего арифметического, необходимо выполнить преобразование одной из этих переменных в формат double.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.