Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпора по яп 2.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
204 Кб
Скачать
☆

42. Работа с файлами. Открытие файла в различных режимах и закрытие файла.

FILE *fopen(const char *filename, char *type);

fopen открывает файл с именем filename и возвращает указатель, используемый для идентификации потока в последующих операциях.

Файл может быть открыт в текстовом или двоичном режиме.

Пример.

FILE *fd;

fd = fopen("a.dat","rb+wb"); // Открыть существующий файл как двоичный

// для чтения и записи

fd = fopen("a.dat","wb+"); // Создать новый файл как двоичный

// для записи и чтения

Int feof(file *stream);

Проверка на достижение конца файла в потоке

feof возвращает ненулевое значение, если обнаружен индикатор конца файла во время выполнения последней операции ввода в потоке, или 0 - если не был обнаружен конец файла.

Int fclose(file *stream);

fclose закрывает поток stream

fclose возвращает 0 при успешном завершении или возвращает EOF, если обнаружена любая ошибка.

FILE *freopen(const char *filename, const char *type, FILE *stream);

закрывает поток, на описание которого указывает stream, а затем открывает файл, на спецификацию которого указывает строка filename. Повторное открытие того же самого файла изменяет права доступа, очищает внутренние буферы и позиционирует указатели записи-чтения либо на начало файла, либо на его конец.

Коды, устанавливающие режимы доступа к открываемым файлам

Символ

Описание

r

Файл открывается только для чтения; если такого файла нет, то возникает ошибка

w

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

a

Файл открывается для добавления в его конец новой информации

r+

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

w+

То же, что и для r+

a+

То же, что и для a, только запись можно выполнять в любое место файла; доступно и чтение файла

t

Файл открывается в текстовом режиме; указывается поле r, w, a, r+, w+, a+

b

Файл открывается в двоичном режиме; указывается поле r, w, a, r+, w+, a+

По умолчанию файл открывается в текстовом режиме.

После работы с файлом доступ к нему необходимо закрыть. Это выполняет функция fclose(указатель_на_файл).

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

Имеется возможность работы с временными файлами, т.е. с такими, которые нужны только в процессе работы программы и которые надо удалить после выполнения части вычислений. В этом случае используют функцию tmpfile со следующим объявлением:

FILE* tmpfile (void);

Функция tmpfile создает на диске временный файл с правами доступа «w+b» и возвращает указатель на управляющий блок по типу атрибута FILE. После завершения работы программы или после закрытия временного файла он автоматически удаляется.

43. Работа с файлами. Чтение и запись данных в файл.

Все действия по чтению/записи данных в файл можно разделить на следующие группы:

1. Посимвольный ввод-вывод

В операциях посимвольного ввода-вывода происходит прием одного символа из файла или передача одного символа в файл.

int fgetс(FILE *fp)

Чтение и возврат символа из открытого файла

int fputс(int ch, FILE *fp)

Записывает в файл код ch символа.

Пример. Посимвольное копирование файла-источника(source) с файл-назначение (destination)

char ch;

FILE *source=fopen(“one”,”rb”);

FILE *destination=fopen(“two”,”wb”);

while (!foef(source))

{

ch=fgetс(source);

fputс(ch,destination);

}

2. Построчный ввод-вывод.

В операциях построчного ввода-вывода за один прием происходит перенос из файла (или в файл) строк символов.

int fgets (char *S, int m, FILE *fp)

Извлекает байты из файла, описываемого fp, и записывает их в строку S до тех пор, пока не встретит символ ' \n ' или пока не будет считано m байтов.

int fputs (char *S, FILE *fp)

Записывает в файл байты из строки S до тех пор, пока не встретится нуль-терминатор, который в файл не переносится и на символ ' \n ' не заменяется.

Пример. Построчное копирование

char string[256];

FILE *source=fopen("1.txt","r");

FILE *destination=fopen("2.txt","w");

...

fgets(string,256,source); //чтение

fputs(string, destination); //запись

...

3. Блоковый ввод-вывод

В операциях блокового ввода-вывода работа происходит с целыми блоками информации.

int fread (void *ptv, int size, int n, FILE *fp)

Считывает n блоков по size байт каждый из файла fp, в область памяти, на которую указывает указатель ptv (необходимо заранее отвести память под считываемый блок).

int fwrite (void *ptv, int size, int n, FILE *fp)

Записывает n блоков по size байт каждый из области памяти, на которую указывает ptv, в открытый файл fp.

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

Пример 1. Чтение и запись целого числа

int number;

FILE *source=fopen("1.txt","r");

FILE *destination=fopen("2.txt","w");

fread(&number,2,1, source); //чтение

fwrite(&number,2,1, destination); //запись

Пример 2. Из того, что функции fread, fwrite копируют данные из памяти в файл без преобразования, "байт в байт", следует естественный способ сохранения в файле переменной любого типа данных, основанный на использовании операции sizeof для определения ее размерности:

FILE *fd;

…

long a; // Записать в файл пере-

fseek (fd, 20L, SEEK_SET); // менную типа long, на-

fwrite (&a, sizeof(long),1,fd); // чиная с позиции 20

struct man b; // Добавить в файл пере-

fseek (fd,0L,SEEK_END); // менную типа struct man

fwrite (&b, sizeof b,1,fd);

double *pd; // Прочитать с начала файла

pd = malloc(n*sizeof((double)); // в динамический массив

fseek(fd,0L,SEEK_SET); // n переменных типа double

fread(pd, sizeof(double),n,fd);

Пример 3. Чтение и запись структурной переменной по шаблону BOOKS

struct {

char name[32];

char title[64];

int year;

float price;

}

FILE *source=fopen("1.txt","r");

FILE *destination=fopen("2.txt","w");

...

fread(&BOOKS,sizeof(BOOKS),1, source); //чтение

fwrite(&BOOKS,sizeof(BOOKS),1, destination); //запись

4 Форматированный ввод-вывод.

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

int fprintf(FILE *stream, const char *format[,аргумент,...]);

Направляет форматированный вывод в поток. Функция выполняет вывод аргументов в поток stream. Формат вывода для каждого аргумента задается в строке формата, определяемой указателем format. Число задаваемых в строке форматов должно совпадать с количеством аргументов.

int fscanf(FILE *stream, const char *format,[,adr ,...]);

Выполняет форматированный ввод из потока.

Пример. Форматированный ввод-вывод

char fam[15]; // фамилия

char name[15]; // имя

FILE *source=fopen("1.txt","r");

FILE *destination=fopen("2.txt","w");

...

fscanf(source,"%s %s", &fam, &name); // чтение

fprintf(destination,"%s %s\n",fam,name); // запись

...

44. Работа с файлами. Указатель текущей позиции в файле, его перемещение к нужной позиции.

int fseek(FILE *stream, long pos, int mode);

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

SEEK_SET 0 // Относительно начала файла, начало файла - позиция 0

SEEK_CUR 1 // Относительно текущей позиции, >0 - вперед, <0 - назад

SEEK_END 2 // Относительно конца файла (значение pos - отрицательное)

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

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

...

fseek(fp,42,SEEK_SET);

...