Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




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

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

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

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

 

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

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

if (! feof(fin))…

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

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

fclose(fin);

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

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

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

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

char Symb=fgetc(fin);

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

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

f putc(Symb,out);

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

#include "stdafx.h"

int main()

{

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); //закрытие файла

}

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

return 0;

}

 

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

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

#include "stdafx.h"

int main(void)

{

char c;

FILE *out; // описание указателя на файл

out=fopen("Liter.txt","w"); //открытие файла для записи

while ((c=getchar())!=EOF) /*пока не будет введен символ конца

fputc(c,out); // запись введенного символа в файл

fclose(out); //закрытие файла

return 0;

}

 

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

Чтение из файла выполняет функция fscanf():

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

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

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

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

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

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

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

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

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

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

Аналогично,

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

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

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

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

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

#include "stdafx.h"

#define n 4

int main()

{

int i=0;

int array[n]={4,44,446,4466}; //описание и инициализация масcива

FILE *out; //описание указателя на файл

out=fopen("num_arr.txt","w"); //открытие файла для записи

for(;i<n;i++)

fprintf(out,"%6d",array[i]); //запись в файл элемента массива

fclose(out); //закрытие файла

return 0;

}

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

                                               
                                               
                                               

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

#include "stdafx.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); //читать из файла число в переменную numb

S+=numb; // добавить numb в сумму

count++; //увеличиваем счетчик на 1 количество

printf("%d\n", numb); //выводим значение numb на экран

}

double aver=(double)S/count; //считаем среднее значение

printf("Average=%lf\n", aver); //вывод среднего значения

fclose(in); //закрыть файл

}

else

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

return 0;

}

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

Рассмотрим другие библиотечные функции, используемые для работы с файлами (все они описаны в файле stdio.h):

1. Функция fputs() записывает строку символов в файл. Она отличается от функции puts() тем, что в качестве второго параметра должен быть записан указатель на переменную файлового типа.

Например:

fputs("Ехаmple", fp);

При возникновении ошибки возвращается значение EOF.

2. Функция fgets() читает строку символов из файла. Она отличается от функции gets() тем, что в качестве второго параметра должно быть указано максимальное число вводимых символов плюс единица, а в качестве третьего - указатель на переменную файлового типа. Строка считывается целиком, если ее длина не превышает указанного числа символов, в противном случае функция возвращает только заданное число символов.

Рассмотрим пример:

fgets(string, n, fp);

Функция возвращает указатель на строку string при успешном завершении и константу NULL в случае ошибки либо достижения конца файла.

3. Функция fread() предназначена для чтения блоков данных из потока. Имеет прототип:

unsigned fread(void *ptr,unsigned size,unsigned n,FILE *fp);

Она читает n элементов данных, длиной size байт каждый, из заданного входного потока fp в блок, на который указывает указатель ptr. Общее число прочитанных байтов равно произведению n*size. При успешном завершении функция fread() возвращает число прочитанных элементов данных, при ошибке - 0.

4. Функция fwrite() предназначена для записи в файл блоков данных. Имеет прототип:

unsigned fwrite(void *ptr,unsigned size,unsigned n, FILE *fp);

Она добавляет n элементов данных, длиной size байт каждый, в заданный выходной файл fp. Данные записываются с позиции, на которую указывает указатель ptr. При успешном завершении операции функция fwrite() возвращает число записанных элементов данных, при ошибке - неверное число элементов данных.

5. Функция fseek() позволяет выполнять чтение и запись с произвольным доступом и имеет следующий прототип:

int fseek(FILE *fp, long count, int access);

Здесь fp - указатель на файл, возвращенный функцией fopen(), count - номер байта относительно заданной начальной позиции, начиная с которого будет выполняться операция, access - способ задания начальной позиции.

Переменная access может принимать следующие значения:

0 - начальная позиция задана в начале файла;
1 - начальная позиция считается текущей;
2 - начальная позиция задана в конце файла.

При успешном завершении возвращается нуль, при ошибке - ненулевое значение.

6. Функция ferror() позволяет проверить правильность выполнения последней операции при работе с файлами. Имеет следующий прототип:

int ferror(FILE *fp);

В случае ошибки возвращается ненулевое значение, в противном случае возвращается нуль.

7. Функция remove() удаляет файл и имеет следующий прототип:

int remove(char *file_name);

Здесь file_name - указатель на строку со спецификацией файла. При успешном завершении возвращается нуль, в противном случае возвращается ненулевое значение.

8. Функция rewind() устанавливает указатель текущей позиции в начало файла и имеет следующий прототип:

void rewind(FILE *fp);




Поделиться с друзьями:


Дата добавления: 2014-12-26; Просмотров: 458; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.