Методичні вказівки до лабораторних робот по С

Інформація про навчальний заклад

ВУЗ:
Інші
Інститут:
Не вказано
Факультет:
ЗІ
Кафедра:
Не вказано

Інформація про роботу

Рік:
2024
Тип роботи:
Методичні вказівки до виконання дипломних та магістерських кваліфікаційних робіт
Предмет:
Програмування мовою С

Частина тексту файла (без зображень, графіків і формул):

Лабораторна робота №1 Тема: Обробка текстових файлів Мета: Навчитись працювати з текстовими файлами, вивчити основні методи обробки текстових файлів та файлові функції для читання і запису текстових файлів. Завдання: Написати програму, яка виводить текст з файлу. Якщо файл не знайдено, то виводиться повідомлення на екран. Обладнання: ПК, пакет turbo c , методичні вказівки до лабораторних робіт. Теоретичні відомості Файл - це іменований розділ для зберігання інформації. Мова С розглядає файл як послідовність байтів, кожний з яких може бути прочитаний індивідуально. Існує два види представлення файлів - двійковий та текстовий. У текстовому представлені файлів кожен байт доступний програмі. Текстові файли MS DOS представляють кінець рядку як /n. Програма написана на С, як /n. Якщо файл представлений у двійковому вигляді, програма буде бачити обидва символи і ніякого перетворення не відбудеться. Звичайно, текстове представлення використовується для текстових, а двійкове – для двійкових файлів. Але можна використовувати будь-яке представлення для будь-якого файлу, хоча текстове представлення двійкового файлу працює погано. В мові С існують стандартні потоки: stdin – стандартне консольне введення; stdout – стандартне консольне виведення. Стандартні потоки відкриваються при кожному запущенні програми. Для роботи з файлами в програмах на C використовується заготовочний файл stdio.h, в якому оголошений спеціальний тип даних – структура FILE, яка призначена для зберігання атрибутів(параметрів) файлів . Поля структури типу FILE є доступними за допомогою спеціальних C-функцій. Оголошення потоку змінної – вказівника на структуру типу FILE, в якій будуть зберігатись атрибути файлу FILE *fl, де *fl – вказівник на файл. Відкриття файлу fl=fopen("шлях до файлу","режим роботи файлу"); Параметр "шлях до файлу" вказує розміщення файлу на дискі і обов’язково містить ім’я файлу и может містити ім’я логічного диску і шлях. Параметр "режим роботи файлу" показує, як буде використовуватись файл: "w" – для запису даних (вивід); "r" – для читання даних (введення); "a" – для додавання даних до існуючих записів. Приклад відкриття файлів: FILE *f_in,*_out; f_in=fopen("My_file1","r"); f_out=fopen("My_file2","w"); Функція fopen() повертає значення вказівнику на структуру типу файл. Якщо файл по якимось причинам не відкривається, функція fopen() повертає значення NULL. Також можна казати додаткові умови режиму відкриття файлу: "b" – двійковий потік; "t" – текстовий потік; "+" – оновлення файлу. Можна прочитати вже відкритий файл або записати в нього інформацію за допомогою спеціальних функцій: Читання(введення):getc(), fscanf(),fgets(),fread() Запис(Виведення): putc(),fprintf(),fputs(),fwrite() При кожній операції введення/виведення вказівник поточної позиції файлу зміщується на одну позицію в сторону кінця файлу. Перевірка признаку кінця файлу Так як при кожній операції введення/виведення відбувається переміщення вказівника поточної позиції в файлі, в деякий момент вказівник досягає кінця файлу. Структура типу FILE має поле – індикатор кінця файлу. Функція feof() перевіряє стан ідентифікатора кінця файлу і повертає значення 0, якщо кінець файлу не був досягнутий, або значення, відмінне від нуля, якщо був досягнутий кінець файлу. Виклик функції: if (! feof(f_in))… перевіряє, що кінець файлу ще не досягнутий. Закритя файлу Після завершення обробки файлу його слід закрити за допомогою функції fclose(). Формат виклику функції fclose(f_in); Хід роботи: Вивчити теоретичні відомості. Написати програму, в якій: 1). Підключити потрібні бібліотеки; 2). Для читання з файлу використати змінну ptr; 3). При відкритті файлу зробити перевірку: якщо змінній ptr присвоєно значення NULL, то файл не знайдено. При цьому виводиться повідомлення повідомлення і програма завершується. Якщо ж ні, то файл відкривається. Після цього файл читається до тих під, поки не настане кінець файлу (!feof(ptr)). 4). Зчитані символи помістити в зміну ch, а потім вивести на екран. Контрольні запитання: 1. Що таке файл? 2. У яких виглядах представляються файли у мові С? 3. Які функції працюють з файлами? 4. Як вони описуються у програмі? Список літератури 1.Шилдт Г.: Пер. с англ. –М.: Издательский дом “Вильямс”, 2002. –704 с 2.Я. Белецкий, “ Турбо Си. Новая разработка”, Моcква, “Машиностроение”, 2004г Лабораторна робота №2 Тема: Обробка двійкових файлів Мета: Навчитися працювати з двійковими файлами, вивчити основні методи обробки двійкових файлів та файлові функції для читання і запису двійкових файлів Завдання: Написати програму, в якій записати 100 цілих, випадково вибраних чисел, в двійковий файл. Обладнання: ПК, пакет turbo c , методичні вказівки до лабораторних робіт. Теоретичні відомості Текстові файли не є єдино можливим способом зберігання інформації на диску. Можна запам'ятовувати інформацію і в двійковому вигляді. Принципово обробка двійкових файлів не дуже сильно відрізняється від обробки текстових файлів. У будь-якому випадку, перш ніж працювати з файлом, слід пов'язати його фізичне ім'я з логічним ім'ям (з файловим потоком) і відкрити файл, вказавши режим доступу. Після роботи з файлом його необхідно закрити. Тим не менше, відмінності обробки двійкових файлів і текстових все ж існують. Розглянемо їх. Відкрити файл для двійкової обробки можна за допомогою виклику функції fopen (), але до всіх режимів доступу додають рядкову латинську букву b. Режими доступу однакові для текстових та для двійкових файлів. FILE * fb = fopen ("Bin_fil.dat", "wb"); відкриє файл для запису в двійковому режимі. А щоб відкрити його для читання і запису слід написати: FILE * fb = fopen ("Bin_fil.dat", "r + b"); після виклику функції fopen () покажчик на файловий потік fb не дорівнює 0, його можна використовувати в наступних зверненнях до функцій роботи з двійковими файлами, таким як fread () і fwrite (). Закривають виконавчі файли, як і текстові, функцією fclose (). Не слід використовувати функції обробки текстових файлів стосовно до двійковим файлів і навпаки. Існує два способи доступу до елементів двійкових файлів: послідовний і довільний. Послідовний доступ до елементів двійкових файлів Послідовний доступ до елементів файлу особливо ефективний, якщо потрібно перебрати всі дані, що зберігаються в ньому. Крім того, якщо файл відкритий для запису, але ще не містить даних (тобто порожній), то заповнення його можливо лише в послідовному режимі. Функція fwrite (), робить запис даних у потік. Прототип її знаходиться в заголовному файлі stdio.h. Синтаксичне опис функції має вигляд: size_t fwrite (const void * ptr, size_t site, size_t n, FILE * stream); араметри функції: const void * ptr - вказівник на вихідні дані, записувані в файл; size_t size - розмір в байтах одного елемента даних; size_t n - число записуваних в файл елементів даних, розміром size байтів кожний; FILE * stream - вказівник на файловий потік, відкритий в двійковому режимі. Оскільки функція fwrite () має в якості одного з своїх аргументів кількість записуваних елементів, можна застосовувати її і для запису в файл відразу цілого масиву, який до моменту запису в файл повинен бути сформований і заповнений даними. Функція читання значень з диска fread () має той же синтаксис, що і функція запису fwrite (), тільки першим аргументом тут є адресу приймача, в який ця функція повинна скопіювати байти з диска. При використанні цієї функції слід переконатися в тому, що розмір приймача достатній для копіювання кількості байтів. Прототип функції fread () знаходиться в заголовному файлі stdio.h. Функція fread () може завантажити більше одного значення з диска в один прийом. Тоді в якості приймача повинен виступати масив елементів відповідного типу і оттаточного розміру. Цей масив може бути статичним, якщо заздалегідь відома довжина файлу, або динамічним, якщо розмір файлу визначається в процесі виконання програми. Float arr_f [100]; . . . fread (& arr_f, sizeof (float), 100, f_inp); Це найшвидший спосіб завантаження з файлу великої кількості чисел. Організація довільного доступу до елементів двійкових файлів Організація довільного доступу до компонентів файлу дозволяє зчитувати значення з будь-якої позиції в файлі, а також записувати нову інформацію в будь-яке місце у файлі. Але до файлів з довільним доступом пред'являється одна жорстка вимога: їх компоненти повинні мати однакову довжину. Двійкові файли дозволяють забезпечити задоволення цієї вимоги. Про те, щоб дані, які будуть знаходитися у файлі довільного доступу, мали однаковий розмір, слід подбати у момент створення файла. Ще раз нагадаємо про те, що первинна запис у файл можлива тільки в режимі послідовного доступу. Для організації довільного доступу до елементів файлу можна здійснити за допомогою функції fseek (), прототип якої описаний в заголовному файлі stdio.h. Синтаксичне опис функції: int fseek (FILE * stream, long offset, int whence); Функція fseek () переміщає внутрішній покажчик файлового потоку, змінюючи місце у файлі, з якого починається наступна операція читання або запису. У разі успішного завершення функція повертає 0, в разі помилки-ненульове значення. Параметри функції: FILE * stream - yказатель на відкритий файловий потік, аналогічної повертається функцією fopen (); long offset - число байтів, на яке потрібно перемістити файловий покажчик у напрямку, вказаному параметром whence. Для переміщення файлового покажчика у зворотному напрямку (в бік початку файлу), слід встановлювати отто рівним від'ємному значенню; int whence - вказує положення точки відліку файлового покажчика, від якої відбуватиметься його переміщення. Значення аргументу whence представлені нижче. Значення аргументу whence Значення Опис SEEK_SET Переміщення файлового покажчика відбувається відносно початку файлу SEEK_END Переміщення файлового покажчика відбувається відносно кінця файлу SEEK_CUR Переміщення файлового покажчика відбувається відносно поточної позиції файлового покажчика При використанні функції fseek () слід дотримуватися обережності, так як через обмеження DOS потрапляння за межі файлу найчастіше не приводить до генерації помилки, тому програмісту самому слід вживати заходів для запобігання звернення до диска за межами відомих кордонів файлу. При організації довільного доступу використовується функція ftell (), що здійснює навігацію всередині файлу. Прототип функції описаний в stdio.h. Ця функція повертає внутрішній покажчик файлового потоку, рівний зсуву в байтах від початку двійкового файлу до байта, з якого починається наступна операція введення / виводу. Це значення можна передати функції fseek (), або використовувати будь-яким іншим чином. Синтаксичне опис функції: long int ftell (FILE * stream). дінственним параметром функції є покажчик на відкритий файловий потік. Наступні оператори демонструють можливості функції fseek (): fseek (f, sizeof (t), SEEK_CUR); - переміщує файловий вказівник з поточної позиції на наступну; fseek (f,-sizeof (t), SEEK_CUR); - на попередню позицію; fseek (f, 0, SEEK_END); - на кінець файлу. При роботі з двійковими файлами не слід забувати додавати букву «b» при вказівці режиму доступу функції fopen (), але потрібно бути особливо уважним, якщо передбачається, що буде здійснюватися довільний доступ до компонентів даного файлу. Приклад. Записати нуль на місце мінімального значення у файлі Test.dat. # Include <stdio.h> # Include <stdlib.h> # Include <io.h> int main () {FILE * f_test; int i_min; / / номер мінімального елемента int handle; / / дескриптор файлу int value, min; f_test = fopen ("Test.dat", "r + b"); if (! F_test) {puts ("Не можна відкрити файл! \ n"); exit (1); } handle = fileno (f_test); / / перетворити відкритий файловий / / Потік в дескриптор файлу fread (& min, sizeof (int), 1, f_test); i_min = 0; for (int i = 0; i <filelength (handle); i + +) {Fread (& value, sizeof (int), 1, f_test); if (value <min) {min = value; i_min = i; } } fseek (f_test, i_min * sizeof (int), SEEK_SET); fwrite (& zero, sizeof (int), 1, f_test); fclose (f_test); return 0; } Функція filelength (f_inp) в якості аргументу приймає дескриптор файлу, відкритого функцією fopen (), і повертає розмір цього файлу. Для отримання дескриптора, використовуваного для ідентифікації файлу, служить функція перетворення файлового відтоку в дескриптор fileno (). Аргументом функції fileno (FILE * stream) є файловий потік. Негативне значення дескриптора служить ознакою помилки. Зауважимо, що, як і в масивах, перший елемент, що знаходиться у файлі, має номер 0, другий - 1 і т.д. Для визначення кінця файлового потоку використовується функція feof (), прототип якої описаний в заголовному файлі stdio.h. Функція повертає істину (1), якщо внутрішній покажчик заданого файлового потоку знаходиться за останнім байтом файлу і брехня (0), якщо внутрішній покажчик файлу знаходиться не в кінці файлу. Хід роботи: Вивчити теоретичні відомості Підключити бібліотеки <stdio.h>, <stdlib.h>, <time.h> Ініціалізувати дані. Відкрити файл та записати в нього данні. Поставити умову, що чисел повинно бути не більше 100. Якщо їх вже 100, то закрити файл Оформити звіт. Контрольні запитання: Чим двійковий файл відрізняється від текстового? Як організувати довільний доступу до елементів двійкових файлів? Які є способи доступу до двійкових файлів? Список літератури 1.Шилдт Г.: Пер. с англ. –М.: Издательский дом “Вильямс”, 2002. –704 с 2.Я. Белецкий, “ Турбо Си. Новая разработка”, Моcква, “Машиностроение”, 2004г Лабораторна робота №3 Тема: Робота з системними областями Мета: Вивчити можливості використання далеких покажчиків для роботи з клавіатурою, правила створення рядкових покажчиків, нульових рядків, нульових символів і їх застосування. Завдання: Написати програму для керування клавіатурою. Обладнання: ПК, пакет turbo c , методичні вказівки до лабораторних робіт. Теоретичні відомості Для роботи З клавіатурою використовуються бібліотечні функції Keypad_Init, Keypad_Read і Keypad_Released. Опис цих функцій: Опис функції Keypad_Init Прототип - void Keypad_Init (unsigned * port) Повертає значення - Немає Опис - ініціалізує порт для роботи з клавіатурою. Повинна викликатися перед використанням інших функцій даної бібліотеки Вимоги - немає Приклад - Keypad_Init (& PORTB) Опис функції Keypad_Read Прототип - unsigned short Keypad_Read (void) Повертає значення - 1 -16 в залежності від натиснутої клавіші і 0, якщо немає натиснутих клавіш. Опис - перевіряє натиснення клавіші. Функція повертає 1 -16 в залежності від натиснутої клавіші і 0, якщо немає натиснутих клавіш Вимоги - порт повинен бути попередньо ініціалізованим першим за допомогою функції Keypad_Init. Приклад - kp = Keypad_Read () Опис функції Keypad_Released Прототіп - unsigned short Keypad_Released (void) Повертає значення - Повертане значення 1 - 16 залежно від клавіші Опис - виклик функції Keypad_Released - блокуючий: функція чекає, поки клавіша не буде натиснута і відпущена. При відпусканні функція повертає код від 1 до 16 в залежності від клавіші Вимоги - порт повинен бути попередньо ініціалізованим першим за допомогою функції Keypad_Init Приклад - kp = Keypad_Released () Наступний програмний код може бути використаний для перевірки клавіатури. Він підтримує клавіатури з матричною організацією від 1 до 4 рядків і від 1 до 4 стовпців. Код, повернений бібліотечними функціями, перекодовується в ASCII-коди [0 .. 9, A.. F]. Додатково використовується однобайтовий лічильник для виведення загальної кількості натискань на клавіші у другому рядку РКІ. unsigned short kp, cnt; char txt [5]; void main () { cnt = 0; Keypad_Init (& PORTC); Lcd_Init (& PORTB); / / Ініціалізація LCD на PORTC Lcd_Cmd (LCD_CLEAR); / / Очищення дисплея Lcd_Cmd (LCD_CURSOR_OFF); / / Відключення курсора Lcd_Out (1, 1, "Key:"); Lcd_Out (2, 1, "Times:"); do { kp = 0; / / Очікування натискання клавіші do / / Закоментувати невживану функцію опитування клавіатури kp = Keypad_Released (); / / Kp = Keypad_Read (); while (! kp); cnt + +; / / підготувати значення для виведення if (kp> 10) kp + = 54; else kp + = 47; / / Вивід його на LCD Lcd_Chr (1, 10, kp); WordToStr (cnt, txt); Lcd_Out (2, 10, txt); } while (1); } / / Кінець прорамми Приклад програми, яка блокує клавіатуру при натиснені клавіші "3" при натиснені комбінації Left Shift+Right Ctr+F3. При повторному натиснені клавіатура розблокується. #include <dos.h> void interrupt (*old9)(); void interrupt new(); void *readvect(int in); void writevect(int in,void *h); unsigned char F3_code=61; unsigned char key3_code=4; char f=0; union regs rr; struct sregs sr; void main() { char string[80]; textbackground(0); clrscr; textattr(0x0a); cprintf("________________________________________"); cprintf(" Низькорівневе програмування "); cprintf("________________________________________"); cprintf("________________________________________"); cprintf(" Керування клавіатурою "); cprintf("________________________________________"); old9=readvect(9); writevect(9,new9); textattr(0x0c); cprintf("\n\n\r\"горяча\"комбінація:"); textattr(0x0a); cprintf("Left Shift,Right Ctr,F3\n\r"); textattr(0x0b); cprintf("Клавіша,яка блокується"); textattr(0x0f); cprintf("3"); textattr(0x07); cprintf("\r\nВвести рядок символів>"); scanf("%s",string); writevect(9,old9); } void *readvect(int in) { rr.a.ah=0x35; rr.a.al=in; intdosx(&rr,&rr,&sr); return(MK_FP(sr.es,rr.x.bx)); } void writevect(int in,void *h) { rr.h.ah=0x25; rr.h.al=in; sr.ds=FP_SEG(h); rr.x.dx=FP_OFF(h); indosx(&rr,&rr,&sr); } void interrupt new9() { unsigned char c,x,y; unsigned char byte17,byte18; unsigned char mask=0x02; unsigned char mask17=0x04; unsigned char mask18=0x01; byte17=peekb(0x40,0x17); byte18=peekb(0x40,0x18); if((inportb(0x60)==F3_code)&&(byte17&mask)&& (byte17&mask17)&&(!(byte18&mask18))) { cputs("\7"); x=wherex(); y=wherey(); gotoxy(55,3); textattr(0x1e); if(f==0) { f=1; cprintf("Клавіша \"3\" заблокована"); } else { f=0; cprintf("Клавіша \"3\" разблокована"); } gotoxy(x,y); textattr(0x07); (*old9)(); } if((f==1)&&(inportb(0x60)==key3_code)) { c=inportb(0x61); outportb(0x61,c|0x80); outportb(0x61,c); outportb(0x20,0x20); } else (*old9)(); } Хід роботи: Вивчити теоретичні відомості. Розібратись з функціями керування клавіатурою. Використовуючи декілька функцій написати програму для деякого керування клавіатурою. Результат роботи записати в звіт. Оформити звіт. Контрольні запитання: Що таке системні області? Які здійснюється керування системними областями? Які є функції для роботи з клавіатурою та керування нею? Список літератури 1.Шилдт Г.: Пер. с англ. –М.: Издательский дом “Вильямс”, 2002. –704 с 2.Я. Белецкий, “ Турбо Си. Новая разработка”, Моcква, “Машиностроение”, 2004г Лабораторна робота №4 Тема: Робота з каталогами і дисководами Мета: Навчитись працювати з каталогами і дисководами за допомогою засобів мови С Завдання: Написати програму, яка визначає поточну директорію на заданому диску. Обладнання: ПК, пакет turbo c , методичні вказівки до лабораторних робіт. Теоретичні відомості Визначення поточної робочої директорії char * getcwd (char * buf,, int buflen); Визначає поточну робочу директорію char * _getdcwd (int disk, char * buf,, int buflen); Визначення поточної директорії для вказаного диска, при цьому 0 - поточний диск, 1 - А, 2 - B, ... Якщо повне ім'я файлу, включаючи нульовий ознака кінця рядка більше ніж buflen, виникає помилка. Якщо buf = NULL, _getdcwd викликає malloc для виділення динамічної пам'яті за адресою buf в кількості buflen байт. Пізніше можна звільнити цю пам'ять за допомогою функції free, використовуючи адресу, повертаний цими функціями. При успіху функції повертають buf. При невдачі вони повертають NULL і привласнюють errno одне з наступних значень: ENODEV - немає такого диска ENOMEM - немає пам'яті для розміщення buf, ERANGE - ім'я каталогу довший, ніж buflen. Приклад. # Include <stdio.h> # Include <dir.h> int main (void) { char buffer [MAXPATH]; getcwd (buffer, MAXPATH); printf ("Поточним каталогом є:% s \ n", buffer); return 0; } Приклад. # Include <direct.h> # Include <stdio.h> char buf [65]; void main () { if (_getdcwd (3, buf, sizeof (buf)) == NULL) perror ("Не можна отримати поточну директорію на диску C: \ n"); else printf ("Поточною директорією на диску C: є% ​​s \ n", buf); } Визначення поточного каталогу диска int getcurdir (int drive, char * directory); directory вказує на область пам'яті розміром не менше MAXDIR, куди буде поміщено ім'я поточного каталогу. Ім'я не містить вказівки диска. Повертає 0 у випадку успіху та -1 при помилці. Приклад. char * current_directory (char * path) { strcpy (path, "X: \ \"); / * fill string with form of response: X: \ * / path [0] = 'A' + getdisk (); / * replace X with current drive letter * / getcurdir (0, path +3); / * fill rest of string with current directory * / return path; } int main (void) { char curdir [MAXPATH]; current_directory (curdir); printf ("The current directory is% s \ n", curdir); return 0; } Визначення розміру вільного дискового простору void getdfree (unsigned char drive, struct dfree * dtable); Функція заповнює структуру dtable для указна диска (0 - поточний диск, 1 - А, 2 - B, ...). struct dfree { unsigned df_avail, / / число вільних кластерів unsigned df_total, / / все кластерів unsigned df_bsec, / / число байтів в секторі unsigned df_sclus, / / число секторів в кластері } При помилку привласнює елементу df_sclus структури dfree значення 0xFFFF. # include <stdio.h> # include <stdlib.h> # include <dir.h> # include <dos.h> int main (void) { struct dfree free; long avail; int drive; drive = getdisk (); getdfree (drive +1, & free); if (free.df_sclus == 0xFFFF) { printf ("Error in getdfree () call \ n"); exit (1); } avail = (long) free.df_avail * (Long) free.df_bsec * (Long) free.df_sclus; printf ("Drive% c: has% ld bytes available \ n", 'A' + drive, avail); return 0; } Визначення / встановленн поточного диска int getdisk (); int setdisk (int drive); Нумерація дисків: 0 - А, 1 - В, 2 - С, ... getdisk повертає номер поточного диска, setdisk повертає загальну кількість доступних дисків. Приклад. # include <stdio.h> # include <dir.h> int main (void) { int disk, maxdrives = setdisk (2); disk = getdisk () + 'A'; printf ("\ nКолічество логічних дисків:% d \ n", maxdrives); printf ("Поточний диск:% c \ n", disk); return 0; } Приклад. # include <stdio.h> # include <dir.h> int main (void) { int save, disk, disks; / * Зберегти вихідний диск * / save = getdisk (); / * Надрукувати кількість логічних дисків * / disks = setdisk (save); printf ("У системі% d логічних дисків \ n \ n", disks); / * Надрукувати імена доступних логічних дисків * / printf ("Доступні диски: \ n"); for (disk = 0; disk <26; + + disk) { setdisk (disk); if (disk == getdisk ()) printf ("% c: диск доступний \ n", disk + 'a'); } setdisk (save); return 0; } Створення, видалення, зміна директорій int mkdir (char * pathname); int rmdir (char * pathname); Видаляє директорію pathname, яка: має бути порожньою, не повинна бути поточної робочої директорією, не повинна бути кореневої директорією. У разі успіху повертають 0, при невдачі errno набуває значень: ENOENT - немає такого файлу або директорії, EACCES - немає доступу, Приклад. int chdir (char * pathname); # include <stdio.h> # include <conio.h> # include <process.h> # include <dir.h> # define DIRNAME "testdir. $ $ $" int main (void) { int stat; stat = mkdir (DIRNAME); if (! stat) printf ("Директорія створена \ n"); else { printf ("Не можу створити директорію \ n"); exit (1); } getch (); system ("dir / p"); getch (); stat = rmdir (DIRNAME); if (! stat) printf ("\ nДіректорія видалена \ n"); else { perror ("\ nне можу видалити директорію \ n"); exit (1); } return 0; } Пошук файлу char * searchpath (char * file); Спочатку пошук здійснюється у поточному каталозі поточного диска. Якщо файл не знайдено, функція перебирає шляху з змінної оточення PATH. У разі успіху повертає рядок, що містить повний шлях до файлу. Це ім'я розміщується в статичному буфері і перезаписується при кожному наступному виклику. У разі невдачі повертається NULL. Перегляд каталогу диска int findfirst (char * pathname, struct ffblk * ffblk, int attrib); int fidtnext (struct ffblk * ffblk); Функція findfirst робить пошук в каталозі диска за допомогою системного виклику DOS 0x4E. Параметр pathname являє собою символьну рядок, що містить необов'язкову специфікацію дискового пристрою, маршрут пошуку та ім'я шуканого файлу. Ім'я файлу може містити шаблони (такі як? Або *). Якщо відповідний файл знайдений, структура ffblk заповнюється інформацією про файл і каталозі, його містить. Cтруктура ffblk визначена наступним чином: struct ffblk { char ff_reserved [21]; / * зарезервовано DOS * / char ff_attrib; / * атрибути * / int ff_ftime; / * час * / int ff_fdate; / * дата * / long ff_fsize; / * розмір * / char ff_fname [13]; / * ім'я файлу * / }; Параметр attrib - це використовуваний в MS-DOS байт атрибуту файлу, який вживається при виборі відповідних для пошуку файлів. Параметр attrib може бути однією з наступних визначених у файлі dos.h констант: FA_NORMAL = 0x00 - Звичайний файл без атрибутів FA_RDONLY = 0x01 - Атрибут "тільки читання". FA_HIDDEN = 0x02 - Прихований файл. FA_SYSTEM = 0x04 - Системний файл. FA_LABEL = 0x08 - Мітка тому. FA_DIREC = 0x10 - Каталог. FA_ARCH = 0x20 - Архів. Відзначимо, що ff_ftime і ff_fdate містять бітові поля для визначення дати та часу. Ці структури підтримуються DOS. Обидві 16-бітові структури діляться на 3 поля: ff_ftime: біти 0-4 Секунди, поділені на 2. (Тобто 10 відповідає 20 секундам). біти5-10 хвилини біти 11-15 години ff_fdate: біти 0-4 день біти 5-8 місяць біти 9-15 рік з 1980 (тобто 9 відповідає 1989) При успішному завершенні, тобто при успішному значення пошуку файлу, відповідного параметру pathname, функція findfirst повертає значення 0. Якщо підходящих файлів більше не існує, або в імені файлу допущена помилка, функція повертають значення -1 і глобальна змінна errno отримує одне з наступних значень: ENOENT - Маршрут доступу або ім'я файлу не знайдені, а змінної doserrno присвоюється одне з наступних значень: ENOENT - Маршрут доступу або ім'я файлу не знайдені. ENMFILE - Немає більше файлів. Функція findnext використовується для вибірки послідовності файлів, відповідних параметру pathname, що задається функцією findfirst. ffblk - це той же самий блок, який заповнюється при виклику функції findfirst. Даний блок містить всю необхідну інформацію для продовження пошуку. При кожному виклику функції findnext буде повертатися одне ім'я файлу до тих пір, поки файли, відповідні параметру, pathname не закінчаться. При успішному завершенні, тобто при успішному значення пошуку файлу, відповідного параметру pathname, функція findnext повертає значення 0. Якщо підходящих файлів більше не існує, або в імені файлу допущена помилка, функція повертає значення -1 і глобальна змінна errno отримує одне з наступних значень: ENOENT - Маршрут доступу або ім'я файлу не знайдені,. а змінної doserrno присвоюється одне з наступних значень: ENOENT - Маршрут доступу або ім'я файлу не знайдені. ENMFILE - Немає більше файлів. Приклад: # Include <stdio.h> # Include <dir.h> int main (void) { struct ffblk ffblk; int done; printf ("Лістинг каталогу *. * \ n"); done = findfirst (**. **, & ffblk, 0); while (! done) { printf ("% s \ n", ffblk.ff_name); done = findnext (& ffblk); } return 0; } Хід роботи: Вивчити теоретичні відомості. Підключити бібліотеки для роботи з директоріями та для виведення даних. Задати буфер даних визначеного розміру. Застосувати функцію для визначення директорії - char * _getdcwd (int disk, char * buf,, int buflen);. Вивести результат роботи на екран. Оформити звіт. Контрольні запитання: Що таке католог? Що таке дисковод? Як визначити поточний каталог диску? Як переглянути каталог диска? Список літератури 1.Шилдт Г.: Пер. с англ. –М.: Издательский дом “Вильямс”, 2002. –704 с 2.Я. Белецкий, “ Турбо Си. Новая разработка”, Моcква, “Машиностроение”, 2004г Лабораторна робота №5 Тема: Динамічні структури даних Мета: Навчитись працювати зі списками , стеками, деревами Завдання: Написати фрагмент програми, в якому виконується занесення елементу до стеку, та отримання елементу зі стека. Розглянути роботу списків та дерев. Обладнання: ПК, пакет turbo c , методичні вказівки до лабораторних робіт. Теоретичні відомості Динамічні структури даних  Динамічні структури даних представляють собою
Антиботан аватар за замовчуванням

13.05.2018 16:05-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!