- •Работа с файловой системой dos
- •Получение справочной информации
- •Void far *drv_addr;
- •24.11Стандартные библиотеки трансляторов Microsoft qc 2.5 и Borland содержат несколько функций, облегчающих получение справочной информации о состоянии дисковой подсистемы.
- •Void _dos_getdrive(unsigned *drive);
- •Void _dos_setdrive(unsigned drive, unsigned *drivecount);
- •Void main(void);
- •Void main(void) {
- •Создание, удаление и переименование каталогов
- •Void main(void);
- •Void main(void) {
- •Void main(void);
- •Void main(void) {
- •If(!mkdir(test_dir)) {
- •Int rename(char *oldname, char *newname);
- •Поиск в каталогах
- •Int _dos_findfirst(char *pattern, struct find_t *found, unsigned attr);
- •Int _dos_findnext(struct find_t *found);
- •Void print_info(struct find_t *pfind) {
- •Работа с файлами
- •Int creat(char *filename, int mode);
- •Int open(char *filename,
- •Int oflag [, int pmode]);
- •Int close(int handle);
- •3.5. Чтение/запись файлов
- •Int write(int handle, void *buffer, unsigned count);
- •Int read(int handle, void *buffer, unsigned count);
- •Void main(int, char *[]);
- •Void main(int argc, char *argv[]) {
- •Int source, taget, I;
- •Int eof(int handle);
- •3.6. Позиционирование
- •Void main(void);
- •Void main(void) {
- •Int handle;
- •3.7. Изменение атрибутов, времени и даты файлов
- •Void main(int argc, char *argv[]);
- •Void main(int argc, char *argv[]) {
- •3.8. Буферизация ввода/вывода
- •Int _cnt; // количество оставшихся байтов
- •Int fclose(file *stream);
- •Int fileno(file *stream);
- •Int fseek(file *stream, long offset, int origin);
- •Int fgetpos(file *stream, fpos_t *pos);
- •Int fsetpos(file *stream, fpos_t *pos);
- •Int fputc(int c, file *stream);
- •Int fgetc(file *stream);
- •Int fputs(char *string, file *stream);
- •Int fgets(char *string, int n, file *stream);
- •Int fprintf(file *stream, char *format [,arg]...);
- •Int fscanf(file *stream, char *format [,arg]...);
- •Void setbuf(file *stream, char *buffer);
- •Int setvbuf(file *stream, char *buffer, int mode,
- •Int fflush(file *stream);
- •Void filecpy(file *stream_from, file *stream_to);
- •Void main(int argc, char *argv[]) {
- •Void filecpy(file *stream_from, file *stream_to) {
- •3.9. Другие функции для работы с файлами
- •Int setmode(int handle, int mode);
- •Void rewind(file *stream);
- •Int dup(int handle);
- •Int dup2(int handle1, int handle2);
- •3.10. Таблица открытых файлов
Void setbuf(file *stream, char *buffer);
Параметр buffer должен указывать на подготовленный пользователем массив, имеющий размер BUFSIZ байтов. Константа BUFSIZ описана в файле stdio.h.
Функция setvbuf() позволяет программе не только указать свой буфер, но и задать его размер:
Int setvbuf(file *stream, char *buffer, int mode,
size_t size);
Параметр stream должен указывать на открытый поток, причем для этого потока до вызова функции setvbuf() нельзя выполнять операции чтения/записи.
Параметр buffer должен указыват на подготовленный программой буфер размером size байтов. Этот буфер будет использоваться для работы с потоком stream.
Параметр mode может иметь значения _IOFBF, _IOLBF, _IONBF. Если mode равно _IOFBF или _IOLBF, параметр size указывает размер буфера. Если параметр mode равен _IONBF, буферизация не используется, парметры buffer и size игнорируются.
Параметры _IOFBF и _IOLBF эквивалентны.
Если в качестве адреса буфера buffer задать значение NULL, функция автоматически закажет буфер размером size.
Функция setvbuf() возвращает ноль при успешном завершении и ненулевую величину, если указан неправильный парметр mode или неправильный размер буфера size.
Для чего может понадобиться изменение размера буфера?
Главным образом - для сокращения времени, необходимого для позиционирования магнитных головок при выполнении операций одновременно над несколькими файлами, например, при копировании файлов, слиянии нескольких файлов в один и т.д.
При закрытии потока функцией fclose() содержимое буфера записывается на диск. Если программе необходимо выполнить запись содержимого буфера на диск без закрытия файла, она может воспользоваться функцией fflush():
Int fflush(file *stream);
Эта функция возвращает ноль при успешной записи буфера на диск, а так же в тех случаях, когда поток либо совсем не имеет буферов, либо открыт только для чтения. При ошибке возвращается значение EOF.
Если поток открыт только для чтения, функция fflush() очищает содержимое буфера, связанного с этим потоком.
В качестве примера приведем текст программы, копирующей содержимое текстового файла. Программа копирует этот файл три раза. В первый раз одна использует буфер стандартного размера, затем увеличивает размер буфера в десять раз, и, наконец, копирует файл без использования механизма буферизации. Каждый раз программа измеряет продолжительность копирования файла с помощью функции clock(), входящей в состав стандартных библиотек трансляторов Microsoft QC 2.5 и C 6.0.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
Void filecpy(file *stream_from, file *stream_to);
// Буфера для файлов
char buf1[BUFSIZ * 10];
char buf2[BUFSIZ * 10];
Void main(int argc, char *argv[]) {
time_t start, end;
FILE *stream_from, *stream_to;
if(argc < 3) {
printf("Задайте имена файлов!\n");
exit(-1);
}
// Открываем файлы и используем для копирования
// буфер стандартного размера
if((stream_from = fopen(argv[1], "rt")) == NULL) {
printf("Задайте имя входного файла!\n");
exit(-1);
}
stream_to = fopen(argv[2], "wt+");
// Определяем время начала копирования
start = clock();
// Выполняем копирование файла
filecpy(stream_from,stream_to);
// Определяем время завершения копирования
end = clock();
// Выводим время копирования при использовании
// буферов стандартного размера
printf("Время копирования: %5.1f Размер буфера, байтов: %d\n",
((float)end - start) / CLK_TCK, BUFSIZ);
// Задаем свой буфер большего размера
if((stream_from = fopen(argv[1], "rt")) == NULL) exit(-1);
stream_to = fopen(argv[2], "wt+");
// Устанавливаем буфера как для входного,
// так и для выходного файлов
setvbuf(stream_from, buf1, _IOFBF, sizeof(buf1));
setvbuf(stream_to, buf2, _IOFBF, sizeof(buf2));
// Копируем файл и измеряем продолжительность
// копирования
start = clock();
filecpy(stream_from,stream_to);
end = clock();
printf("Время копирования: %5.1f Размер буфера: %d\n",
((float)end - start) / CLK_TCK, BUFSIZ * 10);
// Копируем без использования буферизации
if((stream_from = fopen(argv[1], "rt")) == NULL) exit(-1);
stream_to = fopen(argv[2], "wt+");
setvbuf(stream_from, NULL, _IONBF, 0);
setvbuf(stream_to, NULL, _IONBF, 0);
start = clock();
filecpy(stream_from,stream_to);
end = clock();
printf("Время копирования: %5.1f Буферизация не используется\n",
((float)end - start) / CLK_TCK);
exit(0);
}
// Функция для копирования файлов