// ===================================================
// Листинг 23. Проверка возможности получения
//             доступа к физическим записям файла
//
// Файл recacc\recacc.cpp
//
// (C) A. Frolov, 1993
// ===================================================

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <fcntl.h>
#include <io.h>
#include <dos.h>
#include <sys\stat.h>
#include <share.h>

#define BYTE unsigned char
#define WORD unsigned int

extern "C" int LogPhysicalRecord(int, long, long, BYTE, WORD);
extern "C" int LockPhysicalRecordSet(BYTE, WORD);
extern "C" void ReleasePhysicalRecordSet(void);
extern "C" void ClearPhysicalRecordSet(void);


void main(void) {

	char FilePath[255];
	int  FileHandle;
	char Buff[80];
	long RecordStartOffset;
	char msg[] = "PATCH!!!";

	int ccode;
	unsigned count;

	printf("\n*RECACC* (C) Frolov A., 1993\n");

// Вводим имя файла и открываем его на запись
// и чтение

	printf("\nВведите путь к файлу:");
	gets(FilePath);

	strupr(FilePath);

	if ((FileHandle = open(FilePath,
		O_RDWR | O_BINARY | O_DENYNONE, SH_DENYNONE)) == -1) {
		printf("Не могу открыть файл\n");
	}

// Задаем смещение в файле, начиная с которого
// в файл будет записана строка "PATCH!!!"

	printf("\nВведите смещение начала записи:");
	gets(Buff);
	RecordStartOffset = atol(Buff);

// Позиционируем на начало записи

	lseek(FileHandle, RecordStartOffset, 0);

// Делаем попытку изменить содержимое записи

	ccode = _dos_write(FileHandle, msg, strlen(msg), &count);

	if(!ccode)
		printf("Запись обновлена\n");
	else
		printf("Ошибка при обновлении "
			  "записи в файле: %02.2X\n", ccode);

// Закрываем файл

	close(FileHandle);
}

