
- •Методичні вказівки
- •Харків 2012
- •Лабораторна робота № 1 Знайомство користувача з графічним середовищем Linux.
- •Методичні вказівки з організації самостійної роботи студентів:
- •Лабораторна робота № 2 Вивчення засобів реалізації багатозадачності та синхронізації взаємодіючих потоків.
- •Методичні вказівки з організації самостійної роботи студентів:
- •Варіанти завдання:
- •Лабораторна робота № 3 Засоби дослідження та роботи з файловими системами
- •Методичні вказівки з організації самостійної роботи студентів:
- •1. Опис функцій синхронного вводу/виводу
- •2. Опис функцій блокування/розблокування частин файлу
- •3. Приклад програми читання інформації з вхідного файлу і додавання її до іншого файлу
- •Int Read_Write ()
- •Варіанти завдання:
- •Лабораторна робота № 4 Створення віконних Windows- додатків. Засоби керування пам’яттю та розподіл пам’яті.
- •Методичні вказівки з організації самостійної роботи студентів:
- •Варіанти завдання:
- •5 Навчально–методичне забезпечення дисципліни
- •5.1 Основна література
- •5.2 Додаткова література
Лабораторна робота № 3 Засоби дослідження та роботи з файловими системами
Мета роботи:
Вивчити особливості застосування функцій Win32 API та основні засоби роботи з файлами при організації синхронного вводу-виводу.
Обладнання:
ПК, ОС Windows, середовище для відлагодження програмного коду (MS Visual Studio, С++ Builder та ін.).
Методичні вказівки з організації самостійної роботи студентів:
При підготовці до лабораторної роботи рекомендується ознайомитися: з лекційним матеріалом, присвяченим структурі програми, засобам адресації, опису регістрів та поданню даних у пам'яті ЕОМ. Теоретичні положення, які для цього необхідні викладені у пунктах 1.- 4. Після вивчення матеріалу треба виконати завдання до роботи, відповісти на контрольні запитання та скласти звіт.
Зміст звіту:
Звіт повинен містити ціль роботи, загальну постановку задачі, екранні форми, які демонструють роботу програми, програмний код та висновки.
Теоретичні положення:
1. Опис функцій синхронного вводу/виводу
Основні функції, що використовуються для написання прогарам зчитування та запису інформації на прилади:
Функції читання і запису:
BOOL ReadFile (HANDLE hFile,
LPVOID IpBuffer,
DWORD nNunberOfBytesToRead,
LPDWORD IpNumberOfBytesRead,
LPOVERLAPPED IpOverlapped);
BOOL WriteFile (HANDLE hFile,
LPVOID IpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD IpNumberOfBytesWritten,
LPOVERLAPPED IpOverlapped);
Параметр hFile- описувач пристрою, до якого необхідно отримати доступ.
Параметр IpBuffer вказує на буфер, в якого зчитуються дані з пристрою (або з якого записуються дані на пистрій).
Параметри nNumberOfBytesToRead і nNnmberOfBytesToWrite повідомляють функціям ReadFile та WriteFile, скільки байтів потрібно зчитати з пристрою або записати на нього.
Параметри IpNumberOfBytesRead і IpNumberOfBytesWritten містять адресу змінної типу DWORD, до якої функції заносять число успішно переданих байтів (з пристрою або на пристрій).
Параметр IpOverlapped при синхронному вводі/виводі повинен бути NULL.
Обидві функції - ReadFile і WriteFile при успішному виконанні повертають TRUE.
2. Опис функцій блокування/розблокування частин файлу
Блокування частини файлу здійснюється викликом:
BOOL LociFile(HANDLE hFile, DWORD dwFileOffsetlow, DWORD dwFileOffsetHigri. DWORD cbLockLow DWORD cbLockHigh):
Перший параметр, hFile, ідентифікує описувач файла, частину якого потрібно блокувати. Наступні (dwFileOffsetLow і dwFileOffsetHigh) визначають 64-битний зсув початку частини, що блокується всередині файла, а останні два (dwLockLow і dwLockHigh) - число байтів, що блокуються.
При успішному виконанні LockFile повертає TRUE.
Розблокування частини файлу:
BOOL UnlockFile(HANDLE hFile. DWORD dwFileOffsetLow DWORD awFileOftsether, DHORD colinlockLow, DWORD cbUnlockHigh);
Параметри функції UnlockFile аналогічні параметрам LockFile; те ж саме стосується і значення, яке повертається. При розблокуванні частини потрібно використовувати ті ж параметри, що і при блокуванні.
3. Приклад програми читання інформації з вхідного файлу і додавання її до іншого файлу
#include <windows.h>
HANDLE hMainInstance;
CHAR szText[255]; // Масив, для зберігання всіх повідомлень
CHAR *lpszP = szText;
char input_file[] = "C:\\temp\\R_file.txt"; /*змінна, що містить ім'я вхідного файлу і шлях до нього */
char output_file [] = "C:\\temp\\W_file.txt"; /* змінна, що містить ім'я вихідного файлу і шлях */
HANDLE hfile_r, hfile_w, IpBuf;
BOOL bRes;
char dataflow[30] = {0};
static int add=15,
size_r_w=30;
DWORD cod_er;
int Read_Write ();
/* Віконна функція */
LRESULT CALLBACK WndProc (HWND hWnd,INT uMsg,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
static HWND hButton;
case WM_CREATE :
{ /* Створення дочірнього вікна – кнопки */
hButton = CreateWindow ("BUTTON","Считывание",
WS_CHILDWINDOW | WS_BORDER | WS_VISIBLE,
0,0,100,20,hWnd,NULL,hMainInstance,NULL);
return 0;
}
case WM_COMMAND : { /* Якщо повідомлення адресоване дочірньому вікну */
if ((HWND)lParam == hButton) Read_Write();
return 0;
}
case WM_DESTROY : {
PostQuitMessage (0);
return 0;
}
default : return DefWindowProc (hWnd,uMsg,wParam,lParam);
}
}
/* Точка входу */
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, INT nCmdShow)
{
WNDCLASS WndClass = {0};
MSG msg;
HWND hWnd;
hMainInstance = hInstance;
WndClass.style = 0;
WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hCursor = LoadCursor (NULL,IDC_ARROW);
WndClass.hIcon = NULL;
WndClass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = "MyClass";
WndClass.hInstance = hInstance;
if (!RegisterClass (&WndClass))
MessageBox (NULL,"Class","Error",MB_OK);
hWnd = CreateWindow ("MyClass","Чтен_Зап",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL
);
if (!hWnd)
MessageBox (NULL,"Ошибка создания окна","Error",MB_OK);
ShowWindow (hWnd, SW_SHOW);
UpdateWindow (hWnd);
// Отримуємо описувач вхідного файла
hfile_r = CreateFile (input_file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if (!hfile_r)
{
cod_er=GetLastError(); /* Присвоєння змінній коду помилки виконання функції CreateFile */
if (cod_er == 3 | cod_er == 2)
MessageBox (NULL,"Неверно указаны путь или имя входного файла", "Error", MB_OK);
else
{
wsprintf (lpszP,"Ошибка при при открытии входного файла, номер ошибки: %d \n",cod_er);
MessageBox (NULL,lpszP,"Error",MB_OK);
}
return 0;
}
// Отримуємо описувач вихідного файла
hfile_w = CreateFile (output_file,GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if (!hfile_w)
{
cod_er=GetLastError();
if (cod_er == 3 | cod_er == 2)
MessageBox (NULL, "Неверно указаны путь или имя выходного файла !", "Error",MB_OK);
else
{
wsprintf (lpszP,"Ошибка при открытии выходного файла, номер ошибки: %d \n",cod_er);
MessageBox (NULL,lpszP,"Error",MB_OK);
}
return 0;
}
while (GetMessage (&msg,NULL,0,0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
CloseHandle (hfile_r); /* Закриття вхідного файла */
CloseHandle(hfile_w); /* Закриття вихідного файла */
return 0;
}
/* Функція виконання зчитування і вставки до другого файлу */