Написание программы, реализующей обмен (чтение/запись) данных по схемам "Оперативная память - Внешняя память" или "Внешняя память - Внешняя память"

Страницы работы

Фрагмент текста работы

Задание: Написать программу, реализующую обмен (чтение/запись) данных по схемам "Оперативная память - Внешняя память" или "Внешняя память - Внешняя память", и продемонстрировать ее работу на тестовом примере. Данные для тестового примера (размеры файлов, данные для обмена, порядок выборки данных и т.д.) генерируются случайным образом.

Вариант 8: Даны файл прямого доступа и файл последовательного доступа одинакового размера, содержащие одинаковую информацию числового типа. Переписать эти файлы в ОП 10-20 раз. Характеристика: размер файла (диапазон изменения 100-200 Кбайт).

Файл прямого и последовательного доступа:

Объект файлового типа, используемый для последовательного доступа, называется последовательным файлом, а используемый для прямого доступа — прямым файлом.

При последовательном доступе файл рассматривается как последовательность значений, которые передаются в порядке их поступления (от программы или из окружения). Если файл открыт, то передача начинается с начала файла.

При прямом доступе файл рассматривается как набор элементов, занимающих последовательные позиции в линейном порядке; значение может быть передано в элемент файла (или из него), находящийся в любой выбранной позиции. Позиция элемента задается его индексом, который является положительным числом определяемого реализацией целого типа COUNT. Индекс первого элемента в файле (если он есть) равен единице; индекс последнего элемента (если он есть) называется текущим размером; текущий размер файла, не содержащего ни одного элемента, равен нулю. Текущий размер — это характеристика внешнего файла.

Используемые функции и процедуры:

CreateFile

Функция 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

Функция 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); //выделение памяти

Похожие материалы

Информация о работе