- •З дисципліни “Системне програмування”
- •Мета виконання лабораторно-практичних робіт
- •Порядок виконання лабораторно-практичних робіт
- •Оформлення звітів про виконання лабораторно-практичних робіт
- •Лабораторна робота № 1
- •1 Короткі теоретичні відомості
- •1.4 Основні типи даних. Основні типи даних наведено в таблиці.
- •1.5 Операції.
- •Int printf (фороматний рядок, [, argument, ...]);
- •2 Питання вхідного контролю
- •3 Постановка завдання
- •4 Варіанти індивідуальних завдань
- •5 Методичні вказівки
- •6 Приклад розв’язку завдання
- •7 Питання вихідного контролю
- •Лабораторна робота № 2
- •1 Короткі теоретичні відомості Умовний оператор if. Уморвний оператор – це оператор, який виконується в залежності від виконання деякої умови.
- •2 Варіанти індивідуальних завдань
- •3 Методичні вказівки
- •4 Контрольні запитання
- •Лабораторна робота № 3
- •Оператор циклу while. Цикл while – це ітераційний цикл із передумовою. Це оператор циклу, який працює до тих пір, поки деяка умова буде істинною.
- •2 Варіанти індивідуальних завдань
- •3 Методичні вказівки
- •4 Приклад виконання лабораторної роботи
- •5 Контрольні запитання
- •Лабораторна робота № 4
- •1 Короткі теоретичні відомості
- •1.2 Опис масивів. Ім’я масиву це звичайний ідентифікатор. Він має бути унікальним, за ним іде розмірність. Розмір масиву може бути як літеральна константа, так і символьна.
- •Int array[a];
- •Int array[12];
- •Int array[a];
- •1.5 Одновимірні масиви. Одномірні масиви. Одномірний масив має один індекс.. Індекс – це номер в квадратних дужках після імені масиву.
- •2 Питання вхідного контролю
- •3 Варіанти індивідуальних завдань
- •4 Методичні вказівки
- •5 Приклад розв’язку завдання
- •5 Питання вихідного контролю
- •Лабораторна робота № 5
- •1 Короткі теоретичні відомості
- •2 Постановка завдання.
- •3 Варіанти індивідуальних завдань
- •4 Методичні вказівки
- •5 Приклад виконання лабораторної роботи
- •6 Контрольні запитання
- •Лабораторна робота № 6
- •1 Короткі теоретичні відомості
- •2 Питання вхідного контролю
- •3 Варіанти індивідуальних завдань
- •4 Методичні вказівки
- •5 Приклад розв’язку завдання
- •6 Питання вихідного контролю
- •Лабораторна робота № 7
- •1 Короткі теоретичні відомості
- •Int putchar(int c);
- •2 Варіанти індивідуальних завдань
- •3 Методичні вказівки
- •4 Контрольні запитання
- •Лабораторна робота № 8
- •1 Короткі теоретичні відомості
- •2 Постановка задачі
- •3 Варіанти індивідуальних завдань
- •4 Приклад виконання лабораторної роботи
- •5 Контрольні запитання
- •Лабораторна робота № 9
- •1 Короткі теоретичні відомості
- •2 Питання вхідного контролю
- •3 Постановка завдання
- •4 Варіанти індивідуальних завдань
- •5 Методичні вказівки
- •6 Приклад розв’язку завдання
- •7 Питання вихідного контролю
- •Лабораторна робота № 10
- •1 Короткі теоретичні відомості
- •2 Питання вхідного контролю
- •3 Варіанти індивідуальних завдань
- •4 Методичні вказівки
- •5 Приклад розв’язку завдання
- •6 Питання вихідного контролю
- •Лабораторна робота № 11
- •1 Короткі теоретичні відомості
- •2 Питання вхідного контролю
- •3 Постановка завдання
- •4 Варіанти індивідуальних завдань
- •5 Методичні вказівки
- •6 Приклад розв’язку завдання
- •7 Питання вихідного контролю
- •Практична робота № 1
- •1 Короткі теоретичні відомості
- •1.1 Умовний оператор if. Уморвний оператор – це оператор, який виконується в залежності від виконання деякої умови.
- •Оператор виконує наступні дії:
- •Приклад: Написати програму, яка виводить на екран числа від 1 до 7.
- •Оператор while виконує наступні дії:
- •Приклад: Вивести на екран додатні числа менші від 10.
- •Оператор виконує наступні дії:
- •2 Питання вхідного контролю
- •3 Постановка завдання на використання оператора switch
- •4 Варіанти індивідуальних завдань на використання оператора switch
- •5 Варіанти індивідуальних завдань на оператори циклів
- •6 Методичні вказівки
- •7 Приклад розв’язку завдання
- •8 Питання вихідного контролю
- •Практична робота № 2
- •1 Короткі теоретичні відомості
- •Void func( ) /*нічого не повертає*/
- •2 Варіанти індивідуальних завдань:
- •3 Методичні вказівки
- •4 Приклад виконання практичної роботи
- •5 Контрольні запитання
- •Практична робота № 3
- •1 Короткі теоретичні відомості
- •Int putchar(int c);
- •2 Питання вхідного контролю
- •3 Варіанти індивідуальних завдань
- •4 Методичні вказівки
- •5 Приклад розв’язку завдання
- •6 Питання вихідного контролю
- •Практична робота № 4
- •1 Короткі теоретичні відомості
- •2 Питання вхідного контролю
- •3 Постановка завдання
- •4 Варіанти індивідуальних завдань
- •5 Методичні вказівки
- •6 Приклад розв’язку завдання
- •7 Питання вихідного контролю
- •Список рекомендованої літератури
5 Приклад розв’язку завдання
Написати програму, яка записує рядок str у файл і читає 10 символів цього рядка в рядок str1. Одержаний рядок вивести на екран.
Текст програми:
#include <stdlib.h>
#include<conio.h>
#include <stdio.h>
FILE *fp1;
char str[]="qwertyuioplkjhgf", str1[40];
void main( )
{
clrscr();
/* Відкриття файлу для запису і перевірка на правильність його відкриття. */
fp1 = fopen("C:\\work \\list.txt","w" );
if ( fp1!= NULL )
printf("\nSuccessful opening C:\\work \\list.txt in mode w.\n");
else { printf("pomilka\n") ; exit(0); }
fputs(str, fp1) ; /* запис з рядка str в файл fp1 */
fclose(fp1); /* Закриття файлу для запису */
/* Відкриття файлу для читання і перевірка на правильність його відкриття. */
fp1 = fopen("C:\\work \\list.txt","r" );
if ( fp1!= NULL )
printf("\nSuccessful opening C:\\work\\list.txt in mode r.\n");
else { printf("pomilka\n") ; exit(1) ;}
fgets(str1, 11, fp1) ; /* читання з файлу fp1 в рядок str1 10 символів*/
printf("\nstr= %s\n", str1);
fclose(fp1); /* Закриття файлу для читання */
}
6 Питання вихідного контролю
1 В якій бібліотеці знаходяться функції файлового вводу-виводу?
2 Як записуються на мові С імена дискових файлів?
3 Яку інформацію треба передати в функцію fopen() для відкриття файлу?
4 Які режими відкриття файлів для читання Ви знаєте?
5 Які режими відкриття файлів для запису Ви знаєте?
6 Який синтаксис функції для закриття файлів?
Лабораторна робота № 11
Тема: Складання програм для розв’язку задач з використанням функцій прямого доступу до файлів
Мета: Навчитися використовувати бібліотечні функції для організації прямого (довільного) доступу до дискових файлів.
1 Короткі теоретичні відомості
1.1 Прямий доступ до даних у файлах. З кожним відкритим файлом асоціюється маркер позиції, який являє собою системний об’єкт, що вказує місце в файлі, в якому в даний момент виконується операція вводу-виводу. Позиція вказується в байтах від початку файлу. При відкритті файлу вказівник встановлюється на початок файлу і рівний 0, так як файл має довжину 0 і інших позицій в ньому бути не може.
Операції читання даних з файлу і їх запис у файл відбувається, починаючи з поточної позиції маркера. Початкова позиція встановлюється при відкритті файлу й може відповідати початковому або кінцевому байту потоку залежно від режиму відкриття файлу.
При відкритті файлу в режимах “r” й “w” маркер поточної позиції встановлюється на початковий байт потоку, при відкритті в режимі “a” - на останній байт у кінці файлу. При виконанні кожної операції маркер переміщається на нову поточну позицію відповідно до кількості записаних або прочитаних байтів.
Операції читання і запису виконуються в текучому положенні вказівника. Після відкриття файлу для читання перших десяти байт вказівник встановлюється на 10 позиції, звідки і починається наступна позиція вводу. Тому при послідовному вводі чи виводі даних з файлу нема необхідності звертати увагу на вказівник позиції функції вводу виводу самі про це вирішать.
Засоби прямого доступу дають можливість переміщати маркер поточної позиції в файлі на потрібну кількість байт. Кількість позицій переміщення задається виразом або змінною і може бути від’ємним, тобто можливе переміщення як у прямому, так і у зворотному напрямках.
Для контролю над операціями файлового вводу-виводу використовуються прямий доступ. Прямий доступ означає, що дані у файл можна записувати в довільну позицію, так само можна з довільної позиції їх прочитати. Для організації прямого доступу застусовуються бібліотечні функції, які сприяють доступу до даних у файлі в будь-яку позицію. Розглянемо бібліотечні функції для організації прямого (довільного) доступу до даних файлів. Функції прямого доступу працюють з файлами, відкритими в двійковому режимі.
1.2 Функція управління маркером у файлі. Для управління маркером у файлі використовується бібліотечна функція fseek().З її допомогою можна встановити маркер в будь-яку позицію у файлі. Прототип функції fseek() знаходиться в бібліотечному файлі stdio.h і має вигляд:
int fseek(FILE *fp, long a1, int а2).
Аргумент fp є вказівником на структуру FILE, який повертає з функція fopen() при відкритті файлу.
Аргумент a1 задає відстань в байтах, на яку треба перемістити маркер.
Аргумент а2 задає точку, від якої обчислюється зміщення. Цей аргумент приймає одне з трьох значень — символічні константи, які наведенов таблиці.
Таблиця . Значення констант, які задають зміщення в функції fseek()
Константа |
Значення |
Опис |
SEEK_SET |
0 |
Встановлення маркера на байт з порядковим номером a1, починаючи з початку файлу |
SEEK_CUR |
1 |
Зміщення в маркера на a1 байт від його текучого положення |
SEEK_END |
2 |
Встановлення маркера на відстань a1 байт, починаючи з кінця файлу |
Функція повертає 0, коли встановлення маркера в задану позицію було виконано без помилок і ненульове значення у випадку помилки.
Прямий доступ до даних у файлі за допомогою функції fseek() продемонстровано програмою:
#include <stdlib.h>
#include <stdio.h>
void main( ) {
FILE *fp;
int data, i, array[8]={1,5,8,34,56,34,89,100};
long a1;
fp = fopen("c:\\ff.txt", "wb"); /* Відкриття двійкового файлу для запису */
if (fp == NULL) {printf("\n Помилка відкриття файлу."); exit(1); }
i=fwrite(array, sizeof(int), 8, fp); /* Запис масиву у файл */
if ( i!= 8) {printf("\n Помилка запису даних у файл."); exit(1);}
fclose(fp);
fp = fopen("c:\\ff.txt ", "rb"); /* Відкриття файлу для читання */
if (fp == NULL) {printf("\n Помилка відкриття файлу."); exit(1);}
а1=4; /* Присвоєння значення змінній а1=4 */
/* Переміщення маркера на а1 байт від початку*/
if ( (fseek(fp, a1, SEEK_SET)) != 0)
{fprintf(stderr, "\nError using fseek()."); exit(1);}
fread(&data, sizeof(int), 1, fp); /*Читання одного цілого числа в змінну data*/
printf("\nElement %ld has value %d.", a1, data);
fclose(fp); }
1.3 Визначення поточного положення маркера у файлі. Для визначення поточного положення маркера у файлі використовується функція ftell(). Прототип функції знаходиться у бібліотечному файлі stdio.h і має вигляд:
long ftell(FILE *fp) ;
Аргумент fp – є вказівником на структуру FILE, який повертається з функції fopen() при відкритті файлу. Функція повертає значення типу long, яке вказує номер поточного байта у файлі від його початку (початковий номер байта у файлі = 0). У випадку помилки функція повертає -1L (cont -1 типу long).
Приклад програми використання функції ftell():
#include <stdlib.h>
#include <stdio.h>
char msg[]="abcdefghijklmn"; /*присвоєння масиву msg символів з*/
void main(){
FILE *fp; /* Опис вказівника на структуру FILE */
char buf[6]; /* Опис масиву розмірності 6 */
fp = fopen("C:\\ff.TXT", "wb")); /* Відкриття файлу для запису */
if ( (fp = =NULL) { printf( "Помилка відкриття"); exit(1); }
fputs(msg, fp); /*Запис масиву у файл */
if (fputs(msg, fp) == EOF) { printf("Помилка запису."); exit(1); }
fclose(fp); /*Закриття файлу для запису */
fp = fopen("C:\\ff.TXT ", "rb"); /*Відкриття файлу для читання. */
if ( (fp == NULL) { fprintf (".Помилка відкриття "); exit(1); }
printf("\n ftell(fp) =%ld", ftell(fp)); /*Результат ftell(fp)=0 */
fgets(buf, 6, fp); /* Зчитування з файлу fp 5 символів. */
printf("\nAfter reading in %s, position = %ld", buf, ftell(fp));
/* Друк 5 символів з buf і положення файлового вказівника ftell(fp)=5 */
fgets(buf, BUFLEN, fp); /* Зчитування наступних 5 символів. */
printf("\nThe next 5 characters are %s, and position now = %ld", buf, ftell(fp));
/*Друк наступних 5 символів з buf і положення маркера ftell(fp)=10*/
1.4 Функція для встановлення положення маркера на початок файлу. Для встановлення положення маркера на початок файлу використовується бібліотечна функція rewind(). Прототип функції знаходиться у бібліотечному файлі stdio.h і має вигляд:
void rewind(FILE *fp) ;
Аргумент fp - є вказівником на структуру FILE, який повертає функція fopen() при відкритті файлу. Функція використовується тоді, коли з файлу були вже зчитані дані і знову треба повернутися на початок файлу.
Приклад програми використання функції rewind():
#include <stdlib.h>
#include <stdio.h>
char msg[]="abcdhjjtyyuoiklllefghijkl"; /*присвоєння масиву msg символів */
void main(){FILE *fp; /* Опис вказівника на структуру */
char buf[6]; /* Опис масиву розмірності 6 */
fp = fopen("C:\\ff.TXT", "wb")); /* Відкриття файлу для запису */
if ( (fp = =NULL) { printf( "Помилка відкриття"); exit(1); }
fputs(msg, fp); /*Запис масиву у файл */
fclose(fp); /*Закриття файлу для запису*/
fp = fopen("C:\\ff.TXT ", "rb"); /*Відкриття файлу для читання. */
if ( (fp == NULL) { fprintf (".Помилка відкриття "); exit(1); }
fgets(buf, buf, fp); /* Зчитування 5 символів. */
printf("\n%s\n", buf); /*Друк прочитаних символів */
printf("\n %ld\n", ftell(fp)); /* Вивід текучої позиції файлу */
rewind(fp); /* Повернення на початок файлу*/
printf("\n %ld\n", ftell(fp)); /* Вивід текучої позиції файлу */
fgets(buf, buf, fp); /* Зчитування з файлу fp 5-ти початкових символів. */
printf("\n%s\n", buf); /*Друк прочитаних символів */
fclose(fp); }