Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_Лаб_Гриф.doc
Скачиваний:
7
Добавлен:
14.11.2019
Размер:
2.81 Mб
Скачать

Питання для контролю і самостійної роботи

  1. Чи можна використовувати покажчики для передачі даних у функції, для чого це робиться ?

  2. Які типи даних можна передати у функцію з використанням покажчиків і без покажчиків ?

  3. Чи можна змінювати значення даних у функції при використанні покажчиків при наявності модифікатора const ?

  4. Чи можна повертати покажчики з функцій ?

  5. Як оголосити покажчик на функцію ?

  6. Чи можна використовувати покажчики для роботи з функціями різного типу ?

  7. Який тип має ім'я функції ?

  8. Який тип має ім'я масиву ?

  9. Як зв'язати покажчик з конкретною функцією ?

  10. Як використовувати покажчики для виклику функції ?

  11. Як зв'язати і використовувати покажчик на функцію ?

  12. Як викликати функцію з використанням покажчика ?

Заняття№17

Використання функцій високого і низького рівня для роботи з потоками (файлами)

(2 години)

Ціль роботи: навчитися використовувати функції високого і низького рівня при роботі з файлами.

Теоретичні відомості.

Функції для роботи з файлами

сhmod( ) #include <io.h> Змінює режим доступу до файлу.

int chmod(const char *path, int mode);

chsize( ) #include<io.h> Змінює розмір файлу.

int chsize(int handle, long size);

close( ) #include<io.h> Закриває файл.

int close(int handle);

creatnew( ) #include <dos.h> Створює новий файл.

int creatnew(const char *path, int mode);

eof( ) #include<io.h> Визначає, чи досягнутий кінець файлу.

int eof(int handle);

fclose( ) #include <stdio.h> Закриває потік.

int fclose (FILE *stream);

fdopen ( ) #include<stdio.h> Зв'язує потік з логічним номером файлу.

FILE *fdopen(int handle, char *type);

feof( ) #include<stdio.h> Визначає, чи досягнутий кінець файлу.

ferror( ) #include<stdio.h> Виявляє помилки в потоці.

int ferror(FILE *stream);

fgetc( ) #include<stdio.h> Одержує символ з потоку.

int fgetc(FILE *stream);

fgetchar( ) #include<stdio.h> Одержує символ з потоку stdin.

int fgetchar(void);

fgetpos( ) #include<stdio.h>

Повертає положення покажчика поточної позиції у файлі.

int fgetpos(FILE *stream, fpos_t *pos);

fgets( ) #include<stdio.h> Одержує рядок символів з потоку.

char *fgets(char s, int n, FILE *stream);

fopen( ) #include <stdio.h> Відкриває потік.

FILE *fopen(char *filename, char *type);

fprintf( ) #include <stdio.h>

Здійснює форматизоване виведення у потік.

int fprintf(FILE *stream, const char *format [argument,...]);

fputc( ) #include <stdio.h> Виводить символ у потік.

int fputc(int c, FILE *stream);

fputchar( ) #include <stdio.h> Виводить символ у потік stdout.

int fputchar(int c);

fputs( ) #include <stdio.h> Виводить рядок символів у потік.

int fputs(char *string, FILE *stream);

fread( ) #include <stdio.h> Зчитує дані з потоку.

size_t fread(void *ptr, size_t size, size_t n, FILE *stream);

freopen( ) #include <stdio.h> Зв'язує з потоком новий файл.

FILE *freopen(char *filename, char *mode, FILE *stream);

fscanf( ) #include <stdio.h>

Виконує форматизоване введення даних з потоку.

int fscanf(FILE *stream, char *format [adress,...]);

fseek( ) #include <stdio.h> Установлює покажчик файлу в потоці.

int fseek(FILE *stream, long offset, int fromwhere);

fsetpos( ) #include<stdio.h>

Встановлює положення (задає позицію) покажчика поточної позиції у файлі, зв'язаному з потоком stream.

int fsetpos(FILE *stream, const fpos_t *pos);

ftell( ) #include <stdio.h>

Повертає положення покажчика поточної позиції у файлі.

long ftell(FILE *stream);

fwrite( ) <stdio.h>#include Записує дані в потік.

size_t fwrite(void *ptr, size_t size, size_t n, FILE *stream);

getc( ) #include <stdio.h> Вводить символ з потоку.

int getc(FILE *stream);

getchar( ) #include <stdio.h> Вводить символ з потоку stdin.

int getchar(void);

gets( ) #include<stdio.h> Вводить рядок символів з потоку stdin.

char *gets(char *s);

getw( ) #include <stdio.h> Вводить з потоку ціле число.

int getw(FILE *stream);

Переміщає покажчик читання/запису файлу.

lseek( ) #include <io.h>

long lseek(int handle, long offset, int fromwhere);

_open( ) #include <fcntl.h> Відкриває файл для читання чи запису.

int _open(const char *filename, int oflags);

open( ) #include <fcntl.h>; #include <sys\stat.h>;

Відкриває файл для читання чи запису.

int open(const char *filename, int access [unsigned mode]);

putc( ) #include <stdio.h> Виводить символ у потік.

int putc(int c, FILE *stream);

putchar( ) #include <stdio.h> Виводить символ у потік stdout.

int putchar(int c);

puts( ) #include<stdio.h> Виводить рядок у потік stdout.

int puts(const char *s);

putw( ) #include <stdio.h> Поміщає в потік ціле значення.

int putw(int w, FILE *stream);

read( ) #include<io.h> Зчитує дані з файлу.

int read(int handle, void *buf, unsigned len);

rewind( ) #include <stdio.h> Установлює покажчик у початок потоку.

int rewind(FILE *stream);

setmode( ) #include<fcntl.h> Установлює режим відкриття файлу.

int setmode(int handle, unsigned amode);

unlink( ) #include<io.h> Видаляє файл.

int unlink(const char *filename);

vprintf( ) #include <stdarg.h> Здійснює форматизоване виведення даних у стандартний потік stdout.

int vprintf (const char *format, va_list arglist);

write( ) #include<io.h> Записує дані у файл.

int write(int handle, void *buf, unsigned len);

Приклад

/* ЗАНЯТТЯ N17

Розробив Петров О.В.

Оголосити структуру, що містить члени типу int, float, char,

виконати ініціалізацію декількох структур у циклі і запис

їх у файл. Оголосити і виконати ініціалізацію масивів даних для

членів структур, записати їх в окремі файли. Ввести значення

елементів структур, прочитавши їх зі створених файлів даних і

дописати в кінець файлу структур. Прочитати структури з

отриманого файлу і вивести значення членів структур на екран */

#include <stdio.h>

#include <CONIO.H>

#include <CTYPE.H>

#define N 5

int main( void )

{ struct str {

int ces; float ves; char tip; //Дата Вага Вид

} st;

FILE *fstr; //Оголошення покажчика на файл (для структур)

FILE *fces, *fves, *ftip; //Оголошення покажчиків на файли

int a, mces[ ] = {1, 24, 14, 5, 16};

float mves[ ] = {2.3, 3.4, 5.3, 5.6, 2.4};

char mtip[ ] = " abcde ";

clrscr( );

// Відкриття файлів для запису і читання ("w+"):

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

if ((fstr = fopen("fstr.dat", "w +")) == NULL)

{ fprintf(stderr, "Cannot open output file\n"); return 1; }

if ((fces = fopen("fc.dat", "w")) == NULL) //Тільки для запису

{ fprintf(stderr, "Cannot open output file\n"); return 1; }

if ((fves = fopen("fv.dat", "w+")) == NULL)

{ fprintf(stderr, "Cannot open output file\n"); return 1; }

if ((ftip = fopen("ft.dat", "w+")) == NULL)

{ fprintf(stderr, "Cannot open output file\n"); return 1; }

int i = 1;

do { printf(" Введення даних у файл структур: %і\n",і);

met1: printf("Введення дати ( >0, тип - int):"); scanf("%і", &st.ces);

if (st.ces <= 0) { fflush(stdin); goto met1;} fflush(stdin);

met2: printf("Введення ваги ( >0, тип - float):"); scanf("%f", &st.ves);

if (st.ves<=0) { fflush(stdin); goto met2;} fflush(stdin);

met3: printf("Введення виду (тип - сhаr):");scanf("%c", &st.tip);

if (!isalpha(st.tip)) { fflush(stdin); goto met3;}

// Запис отриманої структури у файл fstr

fwrite(&st, sizeof(st), 1, fstr);

i ++;

printf("Вихід а = = 0 Введіть а= "); scanf("%i", &a);

} while(a); //Кінець запису структур у файл fstr

// Запис у файли даних з масивів: mces[ і ], mves[ і ], mtip[ і ]

for(і = 0; і < N; і ++)

{ //Формат і застосування функцій запису у файл:

//int fprintf (FILE *stream, const char *format [, argument, ...]);

fprintf(fces,"%d ", mces[ і ] ); //З масиву mces[ і ]

//size_t fwrite(const void *ptr, size_t size, size_t n, FILE*stream);

fwrite (&mves[і], sizeof(float), 1, fves); //З масиву mves[ і ]

//int fputc(int c, FILE *stream);

fputc ( mtip[ і ], ftip); //З масиву mtip[ і ]

}

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

// int fseek(FILE *stream, long offset, int whence);

fseek(fves, 0L, SEEK_SET); //Установка покажчика файлу fves на початок

fseek(ftip, 0L, SEEK_SET); //Установка покажчика файлу ftip на початок

//Відкриття файлу fces для читання ("r"):

if ((fces = fopen("fc.dat", "r")) = = NULL)

{ fprintf(stderr, "Cannot open input file\n"); return 1; }

printf("Введення даних у структури з файлів даних для окремих членів: \n");

for(і = 0; і < N; і ++)

{ //Формат і застосування різних функцій читання даних

//з файлів і ініціалізація членів структури st :

// int fscanf (FILE *stream, const char *format [, address, ...]);

fscanf (fces, "%d", &st.ces);

// size_t fread(void *ptr, size_t size, size_t n, FILE *stream);

fread (&st.ves, sizeof(float), 1, fves);

// int fgetc(FILE *stream);

st.tip = fgetc (ftip);

// Результати ініціалізації членів структури st

printf("Дата =%d Вага =%f Вид =%c \n", st.ces, st.ves, st.tip);

// Запис отриманої структури в кінець існуючого файлу fstr

fwrite (&st, sizeof(st), 1, fstr);

}

fseek(fstr, 0L, SEEK_SET);

printf("\n Виведення даних з файлу структур: Дата, Вага, Вид \n");

while(1)

{ a = fread(&st, sizeof(st), 1, fstr);

if (a = = 0) goto end;

printf("Дата= %і Вага= %f Вид=%c\n ", st.ces, st.ves, st.tip);

}

end: fclose(fstr);

fcloseall( ); //fclose(fces); fclose(fves); fclose(ftip);

getch( ); return 0;

}

/* Введення даних у файл структур: 1

Введення дати ( >0, тип - int): 3

Введення ваги ( >0, тип - float): 4.6

Введення виду (тип - сhаr): g Вихід а = = 0 Введіть а = 1

Введення даних у файл структур: 2

Введення дати ( >0, тип - int): 19

Введення ваги ( >0, тип - float): 2.7

Введення виду (тип - сhаr): p Вихід а = = 0 Введіть а = 0

Введення даних у структури з файлів даних для окремих членів:

Дата = 1 Вага = 2.300000 Вид = a

Дата = 24 Вага = 3.400000 Вид = b

Дата = 14 Вага = 5.300000 Вид = c

Дата = 5 Вага = 5.600000 Вид = d

Дата = 16 Вага = 2.400000 Вид = e

Виведення даних з файлу структур: Дата, Вага, Вид

Дата = 3 Вага = 4.600000 Вид = g

Дата = 19 Вага = 2.700000 Вид = p

Дата = 1 Вага = 2.300000 Вид = a

Дата = 24 Вага = 3.400000 Вид = b

Дата = 14 Вага = 5.300000 Вид = c

Дата = 5 Вага = 5.600000 Вид = d

Дата = 16 Вага = 2.400000 Вид = e */