- •Введение
- •Достоинства и недостатки языка c
- •Типы данных в с
- •Модификаторы
- •Константы
- •Арифметические операции
- •Логические операции
- •Оператор присваивания
- •Организация множественных выражений
- •Комбинированные операции
- •Локальные и глобальные объекты
- •Модификатор extern
- •Статические и динамические объекты
- •Регистровые переменные
- •Описание неизменяемых объектов
- •Указатели
- •Явное преобразование типа
- •Оператор if
- •Операторы циклов Оператор while
- •Оператор do ... While
- •Оператор for
- •Оператор switch (переключатель)
- •Операторы передачи управления
- •Прототипы функций
- •Передача данных в функцию
- •Структуры и определения типов пользователя
- •Битовые поля
- •Объединения
- •Псевдофункция sizeof
- •Основные директивы препроцессора
- •Основные директивы условной компиляции
- •Дополнительные данные по Turbo-c
- •Организация памяти на машинах класса pc. Виды указателей
- •Работа с указателями на функцию
- •Основные регистры общего назначения процессора
- •Модели памяти
- •Использование стека
- •Организация прерываний в программе. Модификатор volatile
- •Порядок передачи данных в функцию. Модификатор pascal
- •Передача данных в программу. Функция main
- •Разбор типовых ошибок и недочетов при программировании
- •Некоторые функции библиотеки Turbo-c
- •Функции работы с оперативной памятью эвм
- •Функции работы с клавиатурой
- •Работа с дисплеем в символьном режиме
- •Работа с дисплеем в графическом режиме
- •Функции работы с дисками
- •Функции работы с временными интервалами и звуком
- •Функции преобразования данных
- •Функции работы со строками
- •Математические функции
- •Функции работы с файлами и каталогами
- •Функции работы со временем и датой
- •Функции процессов
- •Функции работы с портами машины
- •Интерфейс с дос
- •Задачи на практические занятия
- •Литература
- •Оглавление
Функции работы с дисками
Существует два типа доступа к информации в файлах - последовательный (режим потока), где доступ осуществляется только последовательно к байтам файла, и произвольный.
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);
}