Задание: Написать программу, реализующую обмен (чтение/запись) данных по схемам "Оперативная память - Внешняя память" или "Внешняя память - Внешняя память", и продемонстрировать ее работу на тестовом примере. Данные для тестового примера (размеры файлов, данные для обмена, порядок выборки данных и т.д.) генерируются случайным образом.
Вариант 8: Даны файл прямого доступа и файл последовательного доступа одинакового размера, содержащие одинаковую информацию числового типа. Переписать эти файлы в ОП 10-20 раз. Характеристика: размер файла (диапазон изменения 100-200 Кбайт).
Файл прямого и последовательного доступа:
Объект файлового типа, используемый для последовательного доступа, называется последовательным файлом, а используемый для прямого доступа — прямым файлом.
При последовательном доступе файл рассматривается как последовательность значений, которые передаются в порядке их поступления (от программы или из окружения). Если файл открыт, то передача начинается с начала файла.
При прямом доступе файл рассматривается как набор элементов, занимающих последовательные позиции в линейном порядке; значение может быть передано в элемент файла (или из него), находящийся в любой выбранной позиции. Позиция элемента задается его индексом, который является положительным числом определяемого реализацией целого типа COUNT. Индекс первого элемента в файле (если он есть) равен единице; индекс последнего элемента (если он есть) называется текущим размером; текущий размер файла, не содержащего ни одного элемента, равен нулю. Текущий размер — это характеристика внешнего файла.
Используемые функции и процедуры:
Функция CreateFile создает либо открывает текущий объект и возвращает указатель, используемый для доступа к объекту.
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile );
Параметры:
LpFileName: Указывает на строку, которая определяет имя создаваемого или открываемого объект.
DwDesiredAccess: Определяет тип доступа к объекту. (запись, чтение, чтение\запись и др).
GENERIC_READ - Определяет доступ для чтения. Информация может считываться, а указатель передвигаться.
GENERIC_WRITE - Определяет доступ для записи. Информация может записываться, а указатель передвигаться.
LpSecurityAttributes: указатель на структуру SECURITY_ATTRIBUTES, определяющую , может ли возвращаемый указатель быть унаследованным дочерним процессом. Если NULL- указатель не может быть унаследованным.
DwCreationDistribution: Определяет действия над существующим файломи действия, которые необходимо выполнить. Если файл не существует.
CREATE_NEW – Создает новый файл.
CREATE_ALWAYS – Создает новый файл, переписывает файл. Если он уже существует.
OPEN_EXISTING – Открывает файл. Функция не исполняется если файл не существует.
OPEN_ALWAYS – Открывает файл, если он существует. Если файл не существует, функция создает новый файл, если параметр dwCreationDistribution был CREATE_NEW.
DwFlagsAndAttributes: Определяет атрибуты и флаги для файла.
Функция WriteFile записывает данные в файл. Функция начинает запись данных в файл с позиции , указанной указателем файла.
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
Параметры:
HFile: Определяет файл для записи.
LpBuffer: Указывает на буфер, содержащий данные.
NNumberOfBytesToWrite: Определяет число байтов для записи в файл. LpNumberOfBytesWritten: Указывает на число байтов , записанных при вызове этой функции.
ReadFile
Эта функция читает данные из файла, начиная с позиции, определенной указателем файла.
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
Параметры:
HFile: Определяет файл для чтения.
LpBufferPoints: Указатель на буфер, получающий данные из файла.
NNumberOfBytesToRead:Определяет число байтов, которые необходимо считать из файла.
LpNumberOfBytesRead: казывает на число считанных байтов.
SetFilePointer
Функция SetFilePointer перемещает указатель открытого файла.
DWORD SetFilePointer(
hFile: HANDLE
lDistanceToMove: PLONG
lpDistanceToMoveHigh: PLONG
dwMoveMethod:DWORD
Параметры:
hFile: Дескриптор файла.
lDistanceToMove: Перемещение указателя на заданное
количество байтов.
lpDistanceToMoveHigh: Адрес старшего слова чтобы переместить.
wMoveMethod: Как переместить.
Листинг:
program spo;
{$APPTYPE CONSOLE}
uses
SysUtils,
Windows;
const
//FileSize=100*1024 ; //размер файла
N=11; //число размера блока
M=10; //сколько раз повторять для каждого размера afqkf
File_Size :array [1..N] of Byte=(100,110,120,130,140,150,160,170,180,190,200); // размеры блоков
var
i,k,c,l : Longword;
p : ^QWORD;
data : THandle;
a,b,fr : Int64;
ch:byte;
j:integer;
t,v : Extended;
cs:DWORD;
begin
writeln('fail s posledovatelnim dostypom');
for i:=1 to 11 do // по всем размерам файла
begin
data:=CreateFile('data.txt', // файл копируемый
GENERIC_WRITE, //доступ по записи
0, //объект не может быть разделен
nil, //указатель не унаследован
CREATE_ALWAYS, //
(FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN), // последовательного доступа
0);
if (data=INVALID_HANDLE_VALUE) then Exit; // если файлы не открылись, то выход
Randomize; // заполнение
for j:=1 to File_Size[i]*512 do // переводим в килобайты (*1024) и т.к. пишем по 2 байта сразу то уменьшаем на 2 = 512
begin
ch:=random(100);
writefile(data,ch,2,cs,nil);
end;
CloseHandle(data);
data:=CreateFile('data.txt', // файл, который будет копироваться
GENERIC_READ, //доступ по чтению и записи
0, //объект не может быть разделен
nil, //указатель не унаследован
open_always,
FILE_FLAG_SEQUENTIAL_SCAN, //FILE_ATTRIBUTE_NORMAL, //обычнай файл. Этот признак действителен, только если использовал один.
0);
if (data=INVALID_HANDLE_VALUE) then Exit; // если файлы не открылись, то выход
p:=GlobalAllocPtr(GPTR,File_Size[i]*1024); //выделение памяти
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.