Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB_ZI.doc
Скачиваний:
3
Добавлен:
13.11.2019
Размер:
1.85 Mб
Скачать

7 Питання вихідного контролю

1 Які параметри необхідно передати в функцію malloc()?

2 Що повертає функція сalloc()?

3 Які параметри необхідно передати в функцію realloc()?

4 Що повертає функція malloc(), якщо вона не змогла виділити заданий об’єм пам’яті?

5 В чому різниця між функціями розподілу пам’яті malloc() і calloc()?

Лабораторна робота № 10

Тема: Складання програм з використанням файлового вводу-виводу

Мета: Навчитись працювати з файлами на зовнішніх носіях, оволодіти основами відкриття файлів в текстовому режимі, організувати форматний та безформатний (символьний) ввід-вивід інформації на зовнішні носії.

1 Короткі теоретичні відомості

1.1 Типи дискових файлів. В мові програмування С є два типи потоків: текстові і двійкові. Потік будь-якого з цих типів необхідно асоціювати з файлом. Текстові потоки асоціюються з текстовими файлами. Текстовий файл складається з текстових рядків. Кожний рядок закінчується символом кінця рядка.

Двійкові потоки асоціюються з двійковими файлами. Всі дані зчитуються і записуються в незмінному вигляді без розподілення на рядки і символів кінця рядка. Нульовий символ (\0) і символ кінця рядка (\n). не мають ніякого змістовного значення і зберігаються як будь-який інший файл даних.

1.2 Імена файлів на диску. Кожний файл на диску має ім’я. Ім’я файлу використовується для доступу до його даних. В програмах імена файлів представлені у вигляді символьних рядків, так як і будь-які інші текстові дані.

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

Ім’я файлу може також містити шлях до цього файлу. Шлях вказує диск і каталог, де міститься файл. Якщо ім’я файлу вказано без шляху, то файл повинен бути розміщений в тому каталозі, який операційна система в даний момент рахує робочим. Приклад повного імені файлу в DOS і Microsoft Windows:

C:\data\list.txt.

Це ім’я відноситься до файлу list.txt, який знаходиться в папці data на диску C:. Оскільки в мові С обернена похила коса риска має службове навантаження, то в імені файлу замість одної косої риски використовується дві. Це означає, що вищенаведене ім’я файлу на мові С матиме вигляд:

C:\\data\\list.txt.

1.3 Відкриття файлів. Для роботи з файлами їх необхідно відкрити. При цьому файловий потік потік зв’язується зі вказівником на структуру складного типу FILE, який визначений в бібліотечному файлі <stdio.h>. При відкритті файлу, повертається вказівник на потік, тобто на об’єкт типу FILE.

Відкриттям файлу – це процес, в ході якого створюється потік вводу або виводу, який асоціюється з конкретним файлом на диску. При відкритті файлу, він стає доступним для читання, тобто передачі даних з файлу в програму і для писання, тобто передачі даних з програми в файл, або обох цих операцій.

Для відкриття файлу використовується бібліотечна функція fopen(), прототип якої знаходиться в бібліотечному файлі stdio.h і має вигляд:

FILE *fopen(const char *filename, const char *mode);

Функція повертає вказівник типу FILE * — вказівник на структуру, описану в файлі stdio.h. Елементи структури FILE використовуються програмою для різних операцій з файлами. При відкритті файлу треба описати вказівник на структуру FILE. Синтаксис опису:

FILE *fp; /*Опис вказівника на структуру типу FILE*/

Функції fopen() повертає вказівник (fp) на структуру FILE, який використовується в операціях з файлами. Якщо функція не могла відкрити файл, вона повертає нульовий вказівник NULL. Це може відбутися через збій в пристроях вводу-виводу.

Аргумент filename — це символьний рядок, що містить ім’я відкриваючого файлу або шлях донього. Цей рядок може бути літералом, (послідовністю символів в подвійних лапках) або вказівником на рядкову змінну.

Аргумент mode вказує режим відкриття файлу, тобто, чи є файл двійковий або текстовий, відкривається файл для читання даних чи запису інформації на нього, або для обох цих операцій одночасно. Нижче наведено режими відкриття файлів в текстовому режимі функцією fopen() і їх функції

Режим

Пояснення

r

Відкриття файлу для читання, якщо файл не існує, функція повертає значення NULL

w

Відкриття файлу для запису, якщо файл не існує, він створюється. Якщо файл існує, він знищується без попередження,

a

Відкриття файлу для додавання даних в кінець, якщо файл не існує, він створюється. Якщо файл існує, нові дані дописуються в кінець.

r+

Відкриття файлу для читання і запису, якщо файл не існує, він створюється. Якщо файл існує, нові дані записуються спочатку, знищуючи наявну інформацію.

w+

Відкриття файлу для читання і запису, якщо файл не існує, він створюється. Якщо файл існує, він очищається і нові дані записуються в чистий файл.

a+

Відкриття файлу для читання і добавлення даних, якщо файл не існує, він створюється. Якщо файл існує, нові дані записуються в кінець.

Щоб відкрити файл в двійковому режимі до аргументу mode треба додати букву b. Якщо аргумент mode рівний “a”, то файл відкривається для додавання даних в текстовому режимі, а якщо “ab”, то в двійковому режимі.

1.4 Форматований ввід. Форматований ввід виконується бібліотечною функцією fscanf(). Аналогічно до виводу.scanf(). з тією різницею, що ввід проводиться з заданого файлового потоку, а не з стандартного stdin. Прототип цієї функції знаходиться в бібліотеці stdio.h. і має вид

int fscanf(FILE *fp, char *fmt, ...);

Першим аргументом є вказівник структурного типу FILE, повернутий з fopen() . Для зчитування даних з конкретного файлу треба передати в функцію вказівник, який повертає функція fopen() при відкритті файлу.

Другий аргумент - це рядок формату char *fmt. (Рядок формату - це такий самий рядок, що і в функції scanf(). (це то, що береться в подвійні лапки)).

Третій аргумент це багато крапок, що в прототипі означає змінний список аргументів, в які треба помістити введені дані.

Приклад читання форматованих даних з файлу "C:\\lk\\list.txt":

/* Читанняформатованих даних з допомогою функції fscanf(). */

#include <stdlib.h>

#include <stdio.h>

main(){

int f1, f2, f3, f4, f5;

FILE *fp;

fp = fopen("C:\\work\\list.txt", "r"); /*Відкриття файлу в режимі читання*/

/*Читання з файлу */

fscanf(fp, "%d\n%d\n%d\n%d\n%d\n", &f1, &f2, &f3, &f4, &f5);

printf("The values are %d, %d, %d, %d, %d \n.",f1, f2, f3, f4, f5);

fclose(fp); /* Закриття файлу fp*/}

1.5 Символьний ввід. Термін символьний ввід-вивід відноситься до вводу-виводу як символів так і цілих рядків. Символьний ввід-вивід відноситься до текстових файлів (до файлів, відкритих в текстовому режимі). Для символьного вводу з файлів є функції:

  • fgetc() - Зчитування символів

  • fgets() - Зчитування рядків

Функція fgetc() ідентичні і вводять один символ з заданого потоку. Прототип функції fgetc()

іnt getc(FILE *fp);

Аргумент fp це вказівник на потік вводу, який повертається з функції fopen() при відкритті файлу. Функція повертає введений символ або EOF в випадку помилки.

Функція fgets(). Використовується для читання рядка і має прототип

char *fgets(char *str, int n, FILE *fp) ;

char *str – адреса, за якою розташовані байти, в які треба помістити (зчитати, ввести) введений рядок

n – максимальне число символів (байтів), які можна ввести

FILE *fp це вказівник на файл, який повертається з функції fopen() при відкритті файла, з якого відбувається зчитування.

При успішній роботі функція повертає вказівник str. Значення NULL повертається в двох випадках

1.6 Символьний вивід. Для символьного виводу з файлів є три функції

  • fputc() - Записування символів

  • fputs() - Записування рядків

Функція fputc() виводить один символ в заданий потік. Прототип функції

іnt fputc(int ch, FILE *fp);

Аргумент ch це символ, який треба вивести, формально він має тип int, фактично використовується тільки його молодший байт, в цій змінній міститься записуваний у файл символ.

Аргумент fp це вказівник на потік виводу, який повертається з функції fopen() при відкритті файлу і у який виконується запис.Функція повертає виведений символ або EOF в випадку помилки. Символічна константа EOF =-1 і визначена в файлі stdio.h. Оскільки це значення не відповідає реальному символу, то його можна використати, як кінець файлу в текстовому режимі.

Функція fputs() . Використовується для запису рядка . В ній треба вказати потік виводу, крім того вона не додає символ кінця рядка автоматично – Якщо він потрібний, то програміст повинен сам це ввести. Вона має прототип

char *fputs(char *str, FILE *fp) ;

str – вказівник на рядок з завершуючим нульовим символом, який треба вивести (записати у файл).

FILE *fp - це вказівник на файл, який повертається з функції fopen() при відкритті файла і у який відбувається запис.

Рядок str записується в файл, причому нульовий завершуючий символ \0 відкидається. При успішній роботі функція повертає додатнє значення або EOF, коли була помилка.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]