Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ Программирование и основы алгоритмизации...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.5 Mб
Скачать

Ввод-вывод нижнего уровня

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

open()/close() – открыть/закрыть файл;

creat() – создать файл;

read()/write() – читать/писать данные

eof() – проверить достижение конца файла;

lseek() – изменить текущую позицию в файле;

tell() – получить значение текущей позиции в файле.

Функции нижнего уровня не требуют включения в программу stdio.h. Но нужно включить, если используется константа EOF (признак конца файла).

Открытие / закрытие файла

int fd; //объявление дескриптора

fd=open(имя_файла, флаги, права_доступа);

Параметр имя_файла является указателем на массив символов, содержащий имя файла. Параметр флаги определяет режим открытия файла, который является выражением, сформированным (с помощью «|» - побитовой операции ИЛИ) из одной или более предопределенных констант, размещенных в заголовочном файле fcntl.h.

O_APPEND – открыть файл для добавления (для записи в конец файла);

O_BINARY – открыть файл в бинарном режиме;

O_CREAT – создать и открыть новый файл;

O_EXCL – если он указан вместе с флагом O_CREAT и файл уже существует, то функция открытия файла завершается с ошибкой. Этот флаг позволяет избежать непреднамеренного уничтожения уже существующего файла;

O_RDONLY – открыть файл только для чтения;

O_RDWR – открыть файл и для чтения, и для записи;

O_TEXT – открыть файл в текстовом режиме;

O_TRUNC – открыть существующий файл и стереть его содержимое (подготовить для записи новой информации).

Параметр права_доступа должен применяться только в режиме открытия файла O_CREAT, т.е. только при создании нового файла.

В операционных системах MS-DOS и Windows для задания параметра права_доступа используются следующие предопределенные константы (директива #include <sys\stat.h>):

S_IWRITE – разрешить запись в файл;

S_IREAD – разрешить чтение из файла;

SIREAD|S_IWRITE – разрешить и чтение, и запись.

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

1)Открыть файл для чтения:

fd=open(“t.txt”, O_RDONLY);

2)Открыть файл для чтения и записи;

fd=open(“t.txt”, O_RDWR);

Для закрытия файла служит функция close(fd); - при успешном завершении возвращает 0, в случае ошибки - -1. При завершении программы все открытые файлы автоматически закрываются.

Чтение и запись данных

Ввод-вывод данных на нижнем уровне осуществляется функциями:

int read(fd, char* buffer, unsigned int count); - читает количество байтов, равное count, из файла, открытого с дескриптором файла fd, в буфер, определенный указателем buffer. При достижении конца файла возвращает 0, в случае ошибки - -1. Если файл открыт в текстовом режиме, то последовательность символов CR и LF преобразуется в символ ‘\n’ (LF), как и при работе с потоком.

int write(fd, char* buffer, unsigned int count); - записывает последовательность count байтов в файл fd из буфера buffer. В случае ошибки возвращает -1. В текстовом режиме все символы ‘\n преобразуются в последовательности символов CR, LF.

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

Пример. Копирование последовательности отдельных символов из клавиатуры (дескриптор 0) на экран (дескриптор 1):

#include <io.h>

int main()

{ char c[2];

while((read(0,c,2))>0)

write(1,c,2);

return 0;

}

Прочитанный символ и код клавиши <Enter>, который служит признаком завершения набора вводимой последовательности символов, записываются в массив c[] из 2 байтов, откуда они затем функцией write() выводятся на экран.

Запустив программу на выполнение, можно вводить одиночные символы с клавиатуры, завершая ввод каждого из них нажатием на клавишу <Enter>. Результат работы программы может выглядеть так:

V

V

W

W

E

E

<Ctrl+C).

Первый символ из пары одинаковых символов – это символ, введенный с клавиатуры (отображается на экране). Второй символ выведен на экран функцией write().