Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии 


Безусловно, этот метод применим и к текстовым файлам.




Функция fclose()

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

Функция fclose() имеет следующий прототип,

int fclose(FILE *fp);

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

Использование функций fopen(), fgetc(), fputc() и fclose()

Функции fopen(), fgetc(), fputc() и fclose() составляют минимальный набор операций с файлами. Их использование демонстрируется в следующей программе, которая выполняет копирование файла. Обратите внимание на то, что файлы открываются в двоичном режиме и что для проверки достижения конца файла используется функция feof().

/* Эта программа копирует содержимое одного файла в другой.

*/

#include <stdio.h>

int main(int argc, char *argv[])

{

 FILE *in, *out;

 char ch;

 if(argc!=3) {

  printf("Вы забыли ввести имя файла.");

  return 1;

 }

 if((in=fopen(argv[1], "rb")) == NULL) {

  printf("He удается открыть исходный файл.");

  return 1;

 }

 if((out=fopen(argv[2], "wb")) == NULL) {

  printf("He удается открыть файл-приемник.");

  return 1;

 }

 /* Код копирования содержимого файла. */

 while(!feof (in)) {

  ch = fgetc(in);

  if(!feof(in)) fputc (ch, out);

 }

 fclose(in);

 fclose(out);

 return 0;

}

Функции ferror() и rewind()

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

int ferror(FILE *fp);

Здесь параметр fp — действительный файловый указатель. Функция ferror() возвращает значение true, если при выполнении последней файловой операции произошла ошибка; в противном случае — значение false. Поскольку возникновение ошибки возможно при выполнении любой операции с файлом, функцию ferror() необходимо вызывать сразу после каждой функции обработки файлов; в противном случае информацию об ошибке можно попросту потерять.

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

void rewind(FILE *fp);

Здесь параметр fp — действительный файловый указатель.

Функции fread() и fwrite()

В файловой системе языка С предусмотрено две функции, fread() и fwrite(), которые позволяют считывать и записывать блоки данных. Эти функции подобны С++-функциям read() и write(). Их прототипы имеют следующий вид.

size_t fread(void *buffer, size_t num_bytes, size_t count, FILE *fp);

size_t fwrite(const void *buffer, size_t num_bytes, size_t count, FILE *fp);

При вызове функции fread() параметр buffer представляет собой указатель на область памяти, которая предназначена для приема данных, считываемых из файла. Функция считывает count объектов длиной num_bytes из потока, адресуемого файловым указателем fp. Функция fread() возвращает количество считанных объектов, которое может оказаться меньше заданного значения count, если при выполнении этой операции возникла ошибка или был достигнут конец файла.

При вызове функции fwrite() параметр buffer представляет собой указатель на информацию, которая подлежит записи в файл. Эта функция записывает count объектов длиной num_bytes в поток, адресуемый файловым указателем fp. Функция fwrite() возвращает количество записанных объектов, которое будет равно значению count, если при выполнении этой операции не было ошибки.

Если при вызове функций fread() и fwrite() файл был открыт для выполнения двоичной операции, то они могут считывать или записывать данные любого типа. Например, следующая программа записывает в дисковый файл значение типа float.

/* Запись в дисковый файл значения с плавающей точкой.

*/

#include <stdio.h>

Int main()

{

 FILE *fp;

 float f = 12.23F;

 if((fp=fopen("test", "wb"))==NULL) {

  printf("He удается открыть файл.");

  return 1;

 }

 fwrite(&f, sizeof(float), 1, fp);

 fclose(fp);

 return 0;

}

Как показано в этой программе, роль буфера может выполнять (и при том довольно часто) одна переменная.

С помощью функций fread() и fwrite() часто выполняется считывание и запись содержимого массивов или структур. Например, следующая программа, используя одну только функцию fwrite(), записывает содержимое массива значений с плавающей точкой balance в файл с именем balance. Затем с помощью одной лишь функции fread() программа считывает элементы этого массива и отображает их на экране.

#include <stdio.h>

Int main()

{

 register int i;

 FILE *fp;

 float balance[100];

 /* Открываем файл для записи. */

 if((fp=fopen("balance", "w"))==NULL) {

  printf("He удается открыть файл.");

  return 1;

 }

 for(i=0; i<100; i++) balance[i] = (float) i;

 /* Одним "махом" сохраняем весь массив balance. */

 fwrite(balance, sizeof balance, 1, fp);

 fclose(fp);

 /* Обнуляем массив. */

 for(i=0; i<100; i++) balance[i] = 0.0;

 /* Открываем файл для чтения. */

 if((fp=fopen("balance", "r"))==NULL) {

  printf("He удается открыть файл.");

  return 1;

 }

 /* Одним "махом" считываем весь массив balance. */

 fread(balance, sizeof balance, 1, fp);

 /* Отображаем содержимое массива. */

 for(i=0; i<100; i++) printf("%f ", balance[i]);

 fclose(fp);

 return 0;

}

Использовать функции fread() и fwrite() для считывания и записи блоков данных более эффективно, чем многократно вызывать функции fgetc() и fputc().

Функция fseek() и выполнение ввода-вывода с произвольным доступом

С-система ввода-вывода позволяет выполнять операции считывания и записи данных с произвольным доступом. Для этого служит функция fseek(), которая устанавливает нужным образом индикатор позиции файла. Ее прототип таков.

int fseek(FILE *fp, long numbytes, int origin);

Здесь параметр fp — файловый указатель, возвращаемый функцией fopen(), параметр numbytes — количество байтов относительно исходного положения, заданного параметром origin. Параметр origin может принимать одно из следующих макроимен (определенных в заголовке stdio.h).

Следовательно, чтобы переместить индикатор позиции в файле на numbytes байтов относительно его начала, в качестве параметра origin необходимо использовать значение SEEK_SET. Для перемещения относительно текущей позиции используйте значение SEEK_CUR, а для смещения с конца файла — значение SEEK_END.

Нулевое значение результата функции свидетельствует об успешном выполнении функции fseek(), а ненулевое— о возникновении сбоя. Как правило, функцию fseek() не рекомендуется использовать для файлов, открытых в текстовом режиме, поскольку преобразование символов может привести к ошибочным перемещениям индикатора позиции в файле. Поэтому лучше использовать эту функцию для файлов, открытых в двоичном режиме. Например, если вам нужно считать 234-й байт в файле test, выполните следующий код.

Int func1()

{

 FILE *fp;

 if((fp=fopen("test", "rb")) == NULL) {

  printf("He удается открыть файл.");

  exit (1);

 }

 fseek(fp, 234L, SEEK_SET);

 return getc(fp); /* Считывание одного символа, расположенного на 234-й позиции. */

}

Функции fprintf() и fscanf()

Помимо рассмотренных выше основных функций ввода-вывода, С-система ввода-вывода включает функции fprintf() и fscanf(). Поведение этих функций аналогично поведению функций printf() и scanf(), за исключением того, что они работают с файлами. Именно поэтому эти функции обычно используются в С-программах. Прототипы функций fprintf() и fscanf() выглядят так.

int fprintf(FILE * fp, const char *fmt_string, ...);

int fscanf(FILE * fp, const char *fmt_string, ...);

Здесь параметр fp — файловый указатель, возвращаемый функцией fopen(). Функции fprintf() и fscanf() работают подобно функциям printf() и scanf() соответственно, за исключением того, что их действие направлено на файл, определенный параметром fp.

Удаление файлов

Функция remove() удаляет заданный файл. Ее прототип выглядит так.

int remove(const char *filename);





Рекомендуемые страницы:


Читайте также:

  1. B. 1. В США говорят по-английски. 2. Эта сумка сделана из кожи. 3. Окно разбито. 4. Владимир был построен в 10 веке. 5. Масло и сыр делают из молока. 6.Этот дом был построен моим дедом.
  2. Глава XXVI. Применимое право
  3. Для людей лабильных, неустойчивых (252 – 300) этот транзит считается неблагоприятным, создающим внутреннюю дисгармонию и затуманивающим подсознательный мир.
  4. Класс, который включает виртуальную функцию, называется полиморфным классом. Этот термин также применяется к классу, который наследует базовый класс, содержащий виртуальную функцию.
  5. Клиент процесса должен выполнять этот процесс
  6. КРАТКАЯ ХАРАКТЕРИСТИКА ВИДОВ СВАРКИ И ИХ ПРИМЕНИМОСТЬ
  7. Навигация (которая реализует этот обмен)
  8. Однако этот уровень (4) ближе по своим функциям к трём нижним уровням(1-3), чем к трём (5-7). Поэтому в дальнейшем мы его будем относить к нижнему уровню.
  9. Теория коммуникации, применимая к рекламе
  10. Этот живой ченнелинг состоялся 17 мая 2003 года в Chicago, Illinois, 1 июня 2003 года в Casper, Wyoming и 14 июня 2003 года в Salt Lake City, Utah.
  11. Этот живой ченнелинг состоялся 2 сентября 2002 года в Карибском море.


Последнее изменение этой страницы: 2016-03-17; Просмотров: 280; Нарушение авторского права страницы


lektsia.com 2007 - 2018 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.018 с.) Главная | Обратная связь