Міністерство освіти і науки України
Житомирський державний технологічний університет
Лабораторна робота №2
з курсу «Системне програмування»
м. Житомир 2011 р.
Зміст
1. Розібрати роботу програми find.с
2. Проекспериментувати з функціями findfirst(), findnext(), змінюючи атрибути шуканих файлів
3.Вияснити призначення поля ff_reserved в структурі ffblk
4.Сформувати сьогоднішню дату та час в два байти, відповідно описаним правилам
5.Змінити програму так, щоб вона показувала лише
Контрольні запитання
Висновок
Список використаної літератури
1. Розібрати роботу програми find.с
Підключаємо стандартні бібліотеки:
#include <stdio.h>
#include <stdlib.h>
#include <dir.h>
#include <dos.h>
#include <conio.h>
Оголошуємо прототипи функцій:
void print_info( struct ffblk *find );
char *time_conv( unsigned time, char *char_buf );
char *date_conv( unsigned date, char *char_buf );
Головна функція main() отримує у якості аргументів цілочисельний аргумент argc який містить кількість аргументів у командному рядку та покажчик на масив покажчиків на рядки, де кожен вказує на певний аргумент командного рядка.
void main( int argc, char *argv[] ) {
Оголошуємо змінну find типу ffblk, що є структурою визначеною у бібліотеці <dir.h> і включає наступні поля:
char ff_reserved[ 21 ]; /* зарезервовано для MS-DOS */;
char ff_attrib; /* атрибут з елементу директорія */
unsigned ff_ftime; /* поле часу з елементу директорія */
unsigned ff_fdate; /* поле дати з елементу директорія */
long ff_fsize; /* поле розміру файлу з елементу директорія */
char ff_name[ 13 ]; /*ASCIIZ- рядок з ім’ям і розширенням файлу */
struct ffblk find;
Викличемо функцію findfirst(), задавши їй у якості параметрів другий аргумент із командного рядка, посилання на структуру find та файловий атрибут.
Функція findfirst() повертає нуль у випадку успіху, тобто даний оператор if перевіряє чи виконалась функція із заданими параметрами.
if( !findfirst( argv[1], &find, FA_ARCH ) ) {
Якщо findfirst() виконалася правильно, то інформація буде занесена до структури find. Викличемо функцію print_info(), яка і надрукує структуру у відповідному форматі.
printf( "\n"
"\nFile Name Attr Date Time Size"
"\n------------ ---- ---------- -------- --------" );
print_info( &find );
}
У разі помилки findfirst() поверне -1 і виконається оператор else, який надрукує відповідну інформацію про правильність заповнення командного рядка і завершить виконання програми.
else {
printf( "\nUsage: FIND filename"
"\n Wildcards ""!"" and ""*"" is OK.\n" );
getch();
exit( -1 );
}
Функція findnext() продовжує пошук файлів, який розпочала функція findfirst(). Findnext() також повертає нуль у випадку успішного виконання. Тому за допомогою оператора while продовжуємо пошук до тих пір доки це можливо, тобто доки findnext () не поверне -1.
while( !findnext( &find ) )
print_info( &find );
Завершимо виконання програми.
getch();
exit( 0 );
}
Функція print_info() призначена для друку структури ffblk у відповідному зрозумілому для користувача форматі. Функція нічого не повертає. У якості парметрів приймає покажчик на структуру ffblk.
void print_info( struct ffblk *pfind ) {
Оголосимо два мив мольних масиви, які будуть зберігати відповідно час та дату у форматі рядка.
char timebuf[10], datebuf[12];
Викличемо date_conv() та time_conv() для конвертації полів дати і часу із цілочисельного формату до рядкового.
date_conv( pfind->ff_fdate, datebuf );
time_conv( pfind->ff_ftime, timebuf );
Надрукуємо поля структури ffblk.
printf( "\n%-12s ", pfind->ff_name);
printf( "0x%02X %8s %8s %8ld ",
pfind->ff_attrib, datebuf, timebuf, pfind->ff_fsize );
}
Функція time_conv() конвертує час представлений у вигляді одного беззнакового цілого у рядок. ............