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

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); }

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