Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C.doc
Скачиваний:
29
Добавлен:
08.05.2015
Размер:
1.17 Mб
Скачать

Функции работы с дисками

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

1. Открыть поток. Прототип функции:

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

где filename - имя файла, type - тип файла, задается символами:

r - только чтение,

w - создать для записи,

a - добавление в конец существующего или нового файла,

r+ - для изменения (запись и чтение),

w+ - для изменения (запись и чтение),

t - файл текстовый (символ перевод строки переводится в символы возврат каретки-перевод строки).

b - двоичный файл.

2. Закрыть поток. Прототип функции:

int fclose(FILE *stream);

Возвращается при успехе значение 0.

3. Вывод в поток. Прототип функции:

int fprintf(FILE *stream, char *format[,argument...]);

Параметры строки формата те же, что и для функции printf.

4. Ввод из потока. Прототип функции:

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

Параметры строки формата те же, что и для функции scanf.

5. Открыть файл в режиме произвольного доступа

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

где pathname - полное имя файла, access - режим:

O_RDONLY - только чтение,

O_WRONLY - только запись,

O_RDWR - чтение-запись,

O_CREAT - создание файла, если его нет,

O_BINARY - двоичный файл,

O_TEXT - текстовый файл.

Если используется флаг O_CREAT, то можно использовать параметр permiss, который задает атрибут файла:

S_IWRITE - разрешение записи (архивный),

S_IREAD - только чтение.

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

6. Закрыть файл в режиме произвольного доступа:

int close(int handle);

При успешном завершении возвращает 0, в противном случае (-1).

7. Вывод данных в режиме произвольного доступа. Прототип функции:

int _write(int handle, void *buf, int nbyte);

где handle - номер открытого файла, buf - адрес буфера вывода, nbyte - число выводимых байт.

Функция возвращает число выведенных байт.

8. Ввод данных в режиме произвольного доступа. Прототип функции:

int _read(int handle, void *buf, int nbyte);

где handle - номер открытого файла, buf - адрес буфера вывода, nbyte - число вводимых байт.

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

9. Перемещение указателя файла в режиме произвольного доступа. Прототип функции:

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

где offset задает отступ (как положительный, так и отрицательный), fromwhere задает точку отсчета:

SEEK_SET - 0 - начало файла,

SEEK_CUR - 1 - текущее положение указателя файла,

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

10. Обнаружение конца файла. Прототип функций:

int eof(int handle);

int feof(FILE *stream);

Функции возвращают значение 1 (да) и 0 (нет).

Пример вывода суммы двух чисел в файл:

#include <stdio.h>

main()

{

int i,j;

FILE *str;

/* открываем поток */

str=fopen("test.txt","wt");

/* вводим числа */

printf("\nВведите два числа: ");

scanf("%d%d",&i,&j);

/* выводим данные в поток */

fprintf(str,"%d + %d = %d",i,j,i+j);

fclose(str);

}

Пример вывода суммы двух чисел на принтер:

#include <stdio.h>

main()

{

int i,j;

FILE *str;

/* открываем поток */

str=fopen("prn","wt");

/* вводим числа */

printf("\nВведите два числа: ");

scanf("%d%d",&i,&j);

/* выводим данные в поток */

fprintf(str,"%d + %d = %d",i,j,i+j);

fclose(str);

}

Пример копирования файлов:

/* копирование файлов в режиме произвольного доступа */

#include <stdio.h>

#include <fcntl.h>

#include <io.h>

#include <stat.h>

main()

{

char name1[80],name2[80];

int hand1,hand2;

char a;

/* ввод имени входного файла */

do

{

printf("\nВведите имя входного файла: ");

scanf("%s",name1);

/* определяем, есть ли файл, и открываем его */

hand1=open(name1,O_RDONLY|O_BINARY);

}

while (hand1==-1);

/* ввод имени выходного файла */

printf("\nВведите имя выходного файла: ");

scanf("%s",name2);

/* открываем выходной файл */

hand2=open(name2,O_WRONLY|O_BINARY|O_CREAT,S_IWRITE);

/* копируем файл */

for (;;)

{

if (_read(hand1,&a,1)==0) break;

_write(hand2,&a,1);

}

/* закрываем файлы */

close(hand1);

close(hand2);

}

Пример копирования файлов с буферизацией ввода-вывода:

/* копирование файлов в режиме произвольного доступа */

/* с буферизацией ввода-вывода */

#include <stdio.h>

#include <fcntl.h>

#include <io.h>

#include <stat.h>

#include <alloc.h>

main()

{

char name1[80],name2[80],*buff;

int hand1,hand2,nbyte;

/* отводим память 20000 байт */

buff=malloc(20000);

if (buff==NULL) { printf(“\nНет памяти!\n”); return; }

/* ввод имени входного файла */

do

{

printf("\nВведите имя входного файла: ");

scanf("%s",name1);

/* определяем, есть ли файл, и открываем его */

hand1=open(name1,O_RDONLY|O_BINARY);

}

while (hand1==-1);

/* ввод имени выходного файла */

printf("\nВведите имя выходного файла: ");

scanf("%s",name2);

/* открываем выходной файл */

hand2=open(name2,O_WRONLY|O_BINARY|O_CREAT,S_IWRITE);

/* копируем файл */

for (;;)

{

nbyte=_read(hand1,buff,20000);

if (nbyte==0) break;

_write(hand2,buff,nbyte);

}

/* закрываем файлы и освобождаем память */

close(hand1);

close(hand2);

free(buff);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]