Третій етап включає в себе приклад роботи з 50 файлами одночасно. Для цього організуємо 3 цикли. В першому відкриваµмо 50 файлів, формуючи їх імена. В другому циклі записуємо в кожен файл рядок. У третьому закриваємо відкриті файли.
В кінці програми відбудовуємо сегментную таблицю файлів та звільняємо пам'ять, використану пам'ять допомогою функції DOS 49h.
Версія ДОС зберігається у глобальній змінній модуля <DOS.H> _osmjor.
Функція inc_jft ( ) поширюµ таблицю файл·в завдання в префіксі програмного сегменту програми. При цьому використовуємо функцію DOS 67h :
Вхід : Ah = 67h
Bx = новий максимум числа файл·в
Вихід : Ax = код помилки (якщо встановлений бiт Cf) Функція get_sft ( ) повертає адресу 1-ї системної таблиці файлів.
Для цього за допомогою функції 52h DOS (переривання 21h) визначимо адресу системних керуючих блоків :
Вхід : Ah = 52h
Вихід : ES : BX - адреса 1-го блоку параметр·в диску.
Додавши 4 до отриманої адреси ми одержимо адресу того слова пам'яті, в якій DOS зберігає зміщення адреси 1-ї системної таблиці файлів, а додавши 6, знайдемо адресу, по якій зберігається її сегментна адреса. Після цього з сегментної адреси та зміщення сформуємо покажчик на першу системну таблицю файлів.
Текст Програми.
#include <string.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <DOS.h>
#include <io.h>
#include <fcntl.h>
#include <stat.h>
#include <errno.h>
int inc_JFT(int num);
void get_SFT(void);
void ViewJFT ();
struct psp
{
char buf [24];
char JFT [ 20 ];
char buf1[6];
word JFT_size;
char *JFT_ptr;
}far *p_psp;
struct SFT
{
struct SFT *next; /* Адреса заголовка наступно• сторiнки */
word n_files; /* Число элементiв в цiй таблицi */
} *sft, *sftx;
struct DFCB
{
word n_handles; /* Число дескрiпторiв */
byte open_mode, /* Режим вiдкриття */
reserv1,
attr; /* Атрибути файлу */
word info; /* Стан прилада */
char *drv_ptr; /* Адреса драйвера/DPB */
word First_clust, /* Номер початкового кластера */
F_time, /* час створення файла */
F_date; /* Дата створення файла */
dword F_size, /* Розмiр файла */
F_seek; /* поточне змiщення в файлi */
word lst_cl_n; /* вiдносн. номер поточн. кластера */
union VAR {
struct { /* для DOS 3.x */
word lst_clust, /* Абс. номер поточн. кластера */
dir_sect; /* Номер сектора каталога */
byte dir_num; /* Номер елемента у секторi */
char fname[11]; /* Им`я та розширення */
byte reserved2[6];
word owner; /* PID хозя•на */
byte reserved4[2];
} DOS3;
struct { /* для DOS 4.0 i вище */
word dir_sect; /* Номер сектора каталога */
byte reserved2[2],
dir_num; /* Номер елемента у секторi */
char fname[11]; /* Им`я та розширення */
byte reserved3[6];
word owner, /* PID хозя•на */
lst_clust; /* Абс. номер поточного кластера */
byte reserved4[6];
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.