Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Файлы.doc
Скачиваний:
13
Добавлен:
24.11.2018
Размер:
171.01 Кб
Скачать
      1. Закрытие файла (потока)

Для закрытия потоков, используемых в программе, применяются стандартные функции fclose и fcloseall.

Один заданный поток закрывается функцией fclose. Ее прототип:

int fclose (FILE *stream);

где streamпоток.

Пример обращения к функции fclose:

fclose (f);

Если поток успешно закрыт, функция fclose возвращает значение 0. Если при закрытии потока произошла ошибка – значение EOF (-1).

Функция fcloseall закрывает все потоки, открытые с помощью fopen, кроме stdin, stdout, stderr. Прототип функции fcloseall:

int fcloseall();

Функция fcloseall возвращает количество закрытых потоков или значение EOF (-1), если при закрытии произошла ошибка.

Примечание. Функция perror позволяет вывести сообщение об ошибке при неуспешном закрытии файла. Ее прототип:

void perror(const char *s);

Пример.

FILE * fp;

fp=fopen("d.dat", "r");

if(!fp) perror("Нельзя открыть файл для чтения");

else fclose ("d.dat");

      1. Удаление файла

Удалить файл можно с помощью функции remove. Ее прототип:

int remove (const char *filename);

где filename – указатель на строку с именем физического файла (имя файла).

Функция remove возвращает значение 0 при успешном удалении файла и не нуль в противном случае. Открытый файл необходимо предварительно закрыть.

Пример открытия и закрытия файла.

В текстовый файл с именем rez.txt записываются результаты выполнения программы в начало нового файла, если файл не существует, или в конец существующего файла.

#include <stdio.h>

void main ()

{

int n; //номер теста

float y,x;

FILE *f; //Описание файловой переменной f (файла)

puts(“Введите x”);

scanf(“%f”,&x);

y=2*x;

f=fopen("rez.txt", "a"); //Открытие файла

puts("Номер теста ?");

scanf("%d",&n);

fprintf(f,"Тест N %d\n",n); //Запись в файл f значения

fprintf(f,"%f %f\n",x,y);

fclose(f); //Закрытие файла

fflush(stdin); getchar();

}

В результате первого выполнения программы в текущем каталоге будет создан файл с именем rez.txt. В его начало запишутся значения n, x, y. При последующих запусках программы на выполнение значения n, x, y будут записываться в конец файла rez.txt, на что указывает режим "a" открытия файла в функции fopen. Отсутствие символа "t" или "b" в режиме открытия файла "говорит" о работе с текстовым файлом (но не расширение txt в имени файла).

1.3. Ввод/вывод в поток

1.3.1. Основные понятия

Ввод/вывод в поток можно осуществить разными способами:

  • в виде последовательности байтов;

  • в виде символов и строк;

  • с использованием форматных преобразований.

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

1.3.2. Позиционирование в файле

Функции получения текущего положения указателя потока

ftell и fgetpos

Прототип функции ftell (из <stdio.h>):

long int ftell(File *f);

Функция ftell возвращает текущую позицию в файле, связанном с потоком f, как длинное целое. В случае ошибки возвращает число (-1).

Прототип функции fgetpos (из <stdio.h>):

int fgetpos (File *f, fpos_t *pos);

Функция fgetpos возвращает текущую позицию в файле, связанном с потоком f, и копирует значение текущей позиции по адресу pos. Это значение позднее может использоваться функцией. Возвращаемое значение имеет тип fpos_t, который используется функциями fgetpos и fsetpos для хранения текущей позиции файла:

typedef long fpos_t;