Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК-1_АЯП_рус.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.19 Mб
Скачать

File *указатель на файл;

Четыре шага, необходимых для работы с файлами

1шаг-открыть файл;

2 шаг- закрыть файл;

3 шаг- ввод файла;

4 шаг- вывод файла.

Для открытия файла используется функция

f=fopen(“имя_файла”,”режим”);

Например:

FILE *f;

f=fopen ("B:\LR7.СPP", "w");

Символ "w" определяет право доступа к открываемому файлу. В данном случае открывается файл LR7.СPP на диске B:\ только для чтения.

Для закрытия файла используется функция

Fclose(имя_указателя);

Символ

Описание

R

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

W

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

A

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

r+

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

w+

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

a+

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

T

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

B

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

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

  • Операции посимвольного ввода-вывода,

  • Операции построчного ввода-вывода,

  • Операции ввода-вывода по блокам.

Ниже приведены основные функции, применяемые в каждой из указанных трех групп операций.

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

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

Функция

Действие функции

int fgets(FILE *fp)

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

int fgetchov(void)

Читает и возвращает символ из файла stdin

int ungetc(int ch, FILE *fp)

Возвращает символ ch в файл. Следующая операция чтения символа из файла вернет этот символ

int fputs(int ch, FILE *fp)

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

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

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

1

2

Функция

Действие функции

int gets (char *S)

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

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

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

1

2

int fputs (char *S, FILE *fp)

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

int puts (char *S)

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

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

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

Функции

Действие функции

int freаd (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

Файл можно создать, записать в него данные, стереть данный, обновить данные, дополнить данными. Ввод-вывод в файл осуществляется с помощью методов прямого или последовательного доступа.

Режим последовательного доступа. Ввод-вывода буферизован. Это означает, что программа пишет и читает в буфер; обмен данными между буфером и файлом происходит в случае, если буфер полон, или произошло закрытие файла, или перед выходом из программы.

Рассмотрим пример: считать данные из одного файла и переписать в другой.

#include <stdio.h>

main()

{

FILE *in, *out;

char n1[8], n2[8];

printf("Исходный файл\n");

gets(n1);

printf("Выходной файл\n");

gets(n2);

if ((in = fopen(n1, "rt"))== NULL)

{

printf("Не могу открыть исходный файл\n"); return 1;

}

if ((out = fopen(n2, "wt"))== NULL)

{

printf("Не могу открыть выходной файл\n"); return 1;

}

while (!feof(in))

fputc(fgetc(in), out);

fclose(in);

fclose(out);

}

Строка FILE *in, *out; определяет указатель на два файла. Имя файла м.б. любым- в нашем случае in - исходный файл, out - выходной.

В следующей строке char n1[8], n2[8]; определяем две переменные n1 и n2 для хранения имен файлов. Следующие четыре строки позволяют ввести имена входного и выходного файла и присвоить эти имена переменным n1 и n2. Прежде чем начать работать с файлом он должен быть открыт. Для этого существует функция fopen() в которой первый параметр содержит имя файла, а второй - вид работы, например "rt"– читать файл.

Команда in = fopen(n1, "rt" вызовет открытие файла, запомненного в переменной n1 на чтение, и в программе будет возвращен указатель in на этот файл, которым (указателем) мы и будем пользоваться при чтении символов из файла. Если файл не существует, то значение fp будет NULL, произойдет выполнение fprintf(stderr, "Не могу открыть выходной файл\n"); return 1; и программа завершит работу.

Аналогично работает функция out = fopen(n2, "wt", только теперь out - выходной файл, а вид работы "wt" -запись в файл).

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

Чтение из файла осуществляется вызовом fgetc(in). Читается один символ из файла, связанного с указателем in.

По команде fputc(fgetc(in), out); считанный символ записывается в файл out. Для чтения информации из всего файла используется конструкция

while (!feof(in))

fputc(fgetc(in), out);.

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

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

Аналогично функция fgetc(string,n,fp) читает из файла, связанного с fp, строку и помещает ее в string. Символы читаются, пока не будет получен символ '\n', или пока не исчерпается файл, или пока не будет прочитано (n-1) символов.

Режим прямого доступа более гибок, т.к. позволяет обращаться напрямую к любой записи файла. Минимальной записью для файла прямого доступа является байт. Ниже будет рассмотрен случай файла прямого доступа с записью равной байту. Такие файлы называются двоичными. Файлы прямого доступа незаменимы при написании программ, которые должны работать с большими объемами информации, хранящимися на внешних устройствах. В основе обработке СУБД лежат файлы прямого доступа.

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

1). Каждая запись в файле прямого доступа имеет свой номер. Записи нумерются от 0 до N-1, где N - количество записей в файле. Для двоичного файла N совпадает с длиной файла в байтах. Для открытого файла одна из записей является текущей - говорят, что указатель установлен на данную запись. Перемещать указатель можно при помощи функции lseek.

2). При открытии (или создания файла) указатель автоматически помещается на начало (запись 0). При выполнении операций чтения или записи указатель автоматически перемещается за последнюю считанную (записанную запись) запись.

3). Изменить размер файла (увеличить или урезать) можно при помощи функции chsize. При увеличении размера файла к нему добавляются записи, заполненные кодами 0.

Ниже представлена программа, демонстрирующая работу с файлами.

#include <stdio.h>

#include <io.h>

#include <string.h>

#include <fcntl.h>

#include <SYS\STAT.H>