Закрытие файла
После завершения обработки файла его следует закрыть с помощью функции 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 - начальная позиция задана в начале файла; При успешном завершении возвращается нуль, при ошибке - ненулевое значение. 6. Функция ferror() позволяет проверить правильность выполнения последней операции при работе с файлами. Имеет следующий прототип: int ferror(FILE *fp); В случае ошибки возвращается ненулевое значение, в противном случае возвращается нуль. 7. Функция remove() удаляет файл и имеет следующий прототип: int remove(char *file_name); Здесь file_name - указатель на строку со спецификацией файла. При успешном завершении возвращается нуль, в противном случае возвращается ненулевое значение. 8. Функция rewind() устанавливает указатель текущей позиции в начало файла и имеет следующий прототип: void rewind(FILE *fp);
|