Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб по С и С++ / Лаб_С_№13

.doc
Скачиваний:
65
Добавлен:
17.03.2015
Размер:
45.06 Кб
Скачать

/* ЛАБОРАТОРНАЯ РАБОТА 13 (IN_OUT1)

ФУНКЦИИ ВВОДА И ВЫВОДА СИСТЕМНОГО УРОВНЯ

Все функции ввода/вывода верхнего уровня построены на базе более примитивных функций - функций ввода/вывода системного уровня. Наличие большого количества функций ввода/вывода верхнего уровня является их достоинством, а также недостатком, поскольку использование в одной программе нескольких функций ведет к расходу большего количества памяти. Когда применение функций ввода/вывода верхнего уровня не приносит особых преимуществ программе, можно использовать функции ввода/вывода системного уровня.

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

io.h , содержащий прототипы функций,

fcntl.h, содержащий макроопределения,

sys/stat.h, содержащий макроопределения (для open).

Для получения доступа к файлу используется функция open, которая в качестве результата возвращает неотрицательное целое значение, - дескриптор файла (handle) - которое используется при вызовах функций ввода/вывода. После окончания ввода/вывода файл необходимо закрыть с помощью функции close, после чего дескриптор файла можно использовать для последующего открытия файла.

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

При выполнении любой программы автоматически открываются пять стандартных файлов, имеющих следующие дескрипторы файлов: 0 - файл ввода, 1 - файл вывода, 2 - файл для сообщений об ошибках, 3 - последовательный порт, 4 - устройство печати. Для переопределения дескрипторов используется функция dup.

Далее приводятся описания прототипов функций с кратким пояснением.

Доступ к файлу

int open(const char *path, int access [, int permiss]);

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

O_RDONLY - для чтения

O_WRONLY - для записи

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

Остальные параметры в сочетании (используя |):

O_APPEND - дозапись в конец файла

O_CREAT - создать файл, доступ в соотв. permiss

O_EXCL - только с O_CREAT,ошибка,если файл существует

O_TRUNC - файл усекается до 0,если существ,доступ записи

O_BINARY - двоичный режим

O_TEXT - текстовый режим

Если используется O_CREAT, permiss принимает значения: (используется заголовочный файл sys\stat.h)

S_IWRITE - запись

S_IREAD - чтение

S_IREAD | S_IWRITE - запись и чтение

Возврат при ошибке: -1.

Создать файл

int creat(const char *path, int amode);

Функция (устаревшая) создает файл или усекает до 0, если есть доступ к записи. Для amode см выше параметр permiss. Возврат при ошибке: -1.

Режим чтения файла

int setmode (int handle, int amode);

Для открытого файла с известным дескриптором устанавливается режим чтения файла (параметр amode):

O_BINARY - двоичный O_TEXT - текстовый. Возврат при ошибке: -1.

Закрытие файла

int close (int handle); Функция закрывает файл с дескриптором handle.

Конец файла

int eof (int handle);

Возврат: 0 - не конец файла, 1 - конец файла, -1 - ошибка.

Чтение из файла

int read (int handle, void *buf, unsigned len); Функция считывает len байтов из файла с дескриптором handle в буфер buf. После чтения указатель продвигается на число прочитанных байтов. Возвращает число прочитанных байтов (0 - конец файла). Возврат при ошибке: -1.

Запись в файл

int write (int handle, void *buf, unsigned len);

Функция записывает len байтов из буфера buf в файл. Возвращает число записанных байтов. Возврат при ошибке: -1.

Прямой доступ к файлу

long lseek (int handle, long offset, int fromwhere);

Функция перемещает указатель файла на offset байтов относительно fromwhere:

SEEK_SET - начала файла

SEEK_CUR - текущей позиции указателя

SEEK_END - конца файла.

Возвращает смещение относительно начала файла. Возврат при ошибке: -1L.

Текущая позиция в файле

long tell (int handle);

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

Возврат при ошибке: -1L.

Пример 1. Программа переписывает содержимое файла \autoexec.bat

в utoexec.bak.

#include<io.h>

#include<fcntl.h>

#include<sys\stat.h>

#include<stdlib.h>

#define BUFSIZE 512

void main (void)

{

int in, out; /* описание дескриптеров файлов */

int n;

char bufer[BUFSIZE]; /* буфер для ввода/вывода */

/* открыть файл для чтения */

if((in=open("\\autoexec.bat",O_RDONLY))==-1)

{

/* вывод в файл вывода сообщений об ошибках */

write(2, "cannot open input file\n",25);

exit(1);

}

/* открыть файл для чтения и записи. Если он не существует, создать с возможностью записи, если существует-перезаписать*/

if((out=open("utoexec.bak",O_CREAT|O_RDWR|O_TRUNC,S_IWRITE))==-1)

{

perror("cannot open output file\n");

exit(1);

}

/* чтение и запись идет из буфера по 512 байт */

while((n=read(in,bufer,BUFSIZE))>0)

if(write(out,bufer,n)!=n)

perror("write error");

close(in);

close(out);

}

/* Порядок выполнения задания

1. Получить задание у преподавателя.

2. Проанализировать задачу.

3. Определить круг используемых функций.

4. Изучить необходимые функции.

5. Написать текст программы.

6. Разработать контрольный пример.

7. Провести отладку программы.

8. Выполнить программу.

9. Проверить правильность полученного результата.

ЗАДАНИЕ

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

Вариант 1

Даны два файла. Создать третий файл , объединяющий два файла в один.

Вариант 2

Дан файл. Имя файла не содержит расширения и задается с терминала по запросу. Создать копию файла. Имя файла-копии отличается от исходного тем, что имеет расширение bak. Использовать функцию strcat.

Вариант 3

Дан файл. Подсчитать количество слов в файле, длиннее пяти символов.

Вариант 4

Дан файл. Создать результирующий так, что он содержит каждый n-ый символ исходного файла, где n задается через аргументы функции main.

Вариант 5

Дан файл. Переписать его в обратном направлении.

Вариант 6

Сравнить два файла построчно. Напечатать номер первой неравной строки.

Вариант 7

Дан файл. Создать новый так, чтобы все строки были не длиннее n символов. Длинные строки делить на несколько.

Вариант 8

Исходный файл переписать таким образом, чтобы все буквы верхнего регистра были переведены в нижний регистр и наоборот. Использовать функции tolower, toupper, isupper.

Вариант 9

Дан файл. Подсчитать количество строк в файле и выдать номер самой длинной строки.

Вариант 10

Дан файл. "Разрезать" исходный файл на несколько, каждый из которых содержит n строк, где n задается через аргументы функции main.

Вариант 11

Дан файл. Определить количество символов в файле и вывести на экран слово, стоящее посередине файла.

Соседние файлы в папке Лаб по С и С++