За допомогою функції sprintf() пер направимо змінні hour, minute, second у відповідному форматі до масиву на який вказує buf.



Зміст

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() конвертує час представлений у вигляді одного беззнакового цілого у рядок. Функція приймає у якості параметрів число t, яке і є часом, та покажчик на рядок *buf, що і буде представленням дати у форматі рядка. Функція повертає покажчик на рядок.

char *time_conv( unsigned t, char *buf ) {

Перетворення відбувається наступним чином. Оголосимо цілочисельні змінні hour, minute, second.

int hour, minute, second;

ff_ftime є 16-бітовою структурою поділеною на бітові області, кожна з яких і відповідає годині, хвилині, та секунді. Числу годин відповідають з 11 по 15 біти, хвилин – з 5 по 10, і секунд поділених на 2 – з 0 по 4 відповідно. Таким чином, для того щоб виокремити кожен із елементів, зсунемо побітово число t (час) на відповідну кількість бітів і скористаємося оператором & (і).

hour = ( t >> 11 ) & 0x1F;

minute = ( t >> 5 ) & 0x3F;

second = ( t & 0x1F ) * 2;

За допомогою функції sprintf() пер направимо змінні hour, minute, second у відповідному форматі до масиву на який вказує buf.

sprintf( buf, "%2.2d:%02.2d:%02.2d", hour, minute, second);

return( buf );

}

Функція date_conv(), подібно функції time_conv(), переводить формат подачі дати із цілого числа в рядок. Дню відповідають з 0 по 4 біти, місяцю – з 5 по 8, а року, починаючи з 1980, – з 9 по 15 біти.

char *date_conv( unsigned d, char *buf ) {

int day, month, year;

day = d & 0x1f;

month = ( d >> 5 ) & 0x0f;

year = ( d >> 9 ) + 1980;

sprintf( buf, "%2.2d.%02.2d.%04.2d", day, month, year);

return( buf );

}


Дата добавления: 2020-01-07; просмотров: 112; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!