Лабораторна робота №2 - Ввід інформації з клавіатури. Обмін інформації з файлами засобами мови Turbo C

Назва роботи: Обмін інформації з файлами засобами мови Turbo C

Мета роботи: Ознайомитись з можливостями організації обміну інформацією між файлами засобами бібліотечних функцій Turbo C.

Загальні положення

Бібліотечні функції Turbo C для роботи з файлами можна розділити на дві групи: потокові та префіксні. Як ті так і інші звертаються, в принципі, до одних і тих самих функціональних викликів MS DOS. Але потокові функції виконують додаткову буферизацію, що викликає подвійну буферизацію на рівні бібліотечних функцій і на рівні MS DOS. Префіксні функції одразу звертаються до префіксних функцій MS-DOS: це блок орієнтованих функцій і їх використання дає виграш у продуктивності при перенесенні одразу цілої групи байтів за одне звернення до функцій. Максимальний виграш досягається тоді, коли розмір блоку, що переноситься із програми кратний розміру сектора диску (512 байт). Обмін інформацією між файлом і Сі-програмою по символам і по рядкам більш ефективній при використанні потокового файлового вводу-виводу.

Як для потокових так і для префіксних функцій файлового вводу-виводу можливі два різних режими доступу до файла: текстовий і двійковий. В текстовому режимі відбувається трансляція символів СR (0DH,0AH)(ознака кінця регулярного файлу).При читананні інформації з файла в цьому режимі пара символів СR LF перетворюється в один символ нового рядка ' ',а при записі символ нового рядка перетворюється в пару символів СR LF. Крім того як тільки з файла зчитується символ Crtl-Z,(ASCII 1AH - символ EOF регулярного файла ),рахується, що кінець файла вже досягнуто(умова EOF).

Таким чином у текстовому файлі не можна прочитати інформацію після символа Crtl-Z. При виконанні файлового вводу-виводу у двійковому режимі ніякого перертворення символів не відбувається, а всі вони розглядаються як такі, що не мають якогось особливого значення.

Режим доступу дофайлу задається під час відкриття файлу через бібліотечну функцію відкриття або спеціальною зовнішньою змінною, яка описана в заголовочних файлах fcntl. h або stdlib. h і може приймати два значення:

    0-BINARY - доступ до файла виконуються у двійковому режимі; 0-ТЕХТ - доступ до файла виконується в текстовому режимі;

По замовченню fmode встановлюється в значення 0-ТЕХТ.

Це значення може бути перевизначене при відкритті файла або оператором присвоєння.

Доступ до файлів через потік вводу-виводу.

Відриття файла вводу-виводу через потік виконує функція fopen( ), закриття fclose( ).Приклад, що демонструє використання функцій стандартної бібліотеки для відкриття та закриття файлів *L3-1.C*.Ім'я та режим відкриття задаються в командному рядку при запуску програми. Після успішного відкриття файла програма може виконувати файловий ввід-вивід. Функція потокового вводу-виводу можна розділити на чотири групи:

Функції символьного вводу-виводу, за одне звертання до яких переноситься один символ;

Функції порядкового вводу-виводу, за одне звертання до яких переноситься ASCIIZ-рядок символів( рядок у форматі ASCIIZ - це масив

Елементів типу char, в кінці якого символ''нуль-термінатор);

Функції блокового вводу-виводу, за одне звертання до яких переноситься цілий блок (або запис) інформації;

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

Приклад посимвольного вводу-виводу інформації у файли, що відкриті як потоки - *L3-2.C*.Програма *L3-3.C* виконує посимвольне копіювання файла джерела у файл призначення.

Приклад порядкового вводу-виводу - *L3-4.C*, *L3-5.C*. Функції dfread( )та fwrite( ) дозволяють виконувати виконувати перенос між файлом і програмою блока байтів або записів (records).Блок (запис)- це група поруч

Розташованих байтів, що немають ніяких спеціальних розділювачів.

Приклад блокового вводу-виводу - *L3-6.C*.Функції форматованого вводу-виводу наведені у прикладі *L3-7.C*.

Регулярний та спеціальні символьні файли не логічному рівні представляються стрічкою байтів, що має початок і кінець. Місце у файлі куди записується інформація, або звідки вона зчитується, визначається значенням покажчика запису-читання файла. Стандартна Сі - бібліотека включає функції, що дозволяють встановлювати на потрібному місці у файлі покажчик запису-читання, або, інакше кажучи, виконувати доступ до довільного байту файла. При виконанні послідовного доступу покажчик позиціонується автоматично на довільній операції читання чи запису. Але "пересуновши" покажчик на довільне місце, можна читати інформацію з файла або записувати її в файл у довільному порядку. Дві потокові функції, що найчастіше використовуєтьсядля явного керування положенням покажчика записучитання це rewind( ) та fseek( ).

Приклад довільного доступу до файлів - *L3-8.C*.

Префіксний доступ до файлів

Turbo C вміщує певну групу функцій префіксного доступут до файлів, або так званих "системних викликів" або "процедур нижнього рівня" ( LOW LEVEL FILE I/O Routines ).

Префіксне відкриття файла здійснюють дві функції: open( ), _open( ).

Наступні функції створюють файли : creat( ), _creat( ), createnew( ),

Createtemp( ).Закриття файлів відкритих префіксним доступом, виконується функціями close( ), _close( ).Hеявне закриття файлів, відкритих програмою, виконує операційна система при завершенні програми.

Приклад використання цього класу функцій - *L3-12.C*, *L3-13.C*, *L3-14.C*.

Перенесення інформації між прикладною програмою і файлом для префіксного доступу, виконують дві пари функцій: read ( )/_read( ) та

Write( )/_write( ). Приклад використання *L3-15.C*.

Порядок виконання роботи

В середовищі MS DOS ініціалізувати одну з систем програмування:

Turbo C, Turbo C++, Borland C++.

2. Відкомпілювати та виконати один або декілька прикладів, вказаних

Викладачем, виконючи модифікації, потрібні для функціонування тих чи інших функцій. Всі приклади з ВООК2.

3. Зробити висновки щодо особливостей функціонування засобів обміну інформацію між файлами.

Результат виконання роботи:

#include <stdio. h>

#include <stdlib. h>

#include <conio. h>

#include <string. h>

#include <io. h>

#define NAME 32

#define TITLE 64

Typedef struct {

Char name[32];

Char title[64];

Int year;

Float price;

} BOOKS;

Int file_input_book(FILE * fp, BOOKS * ptr){

Return(fread(ptr, sizeof(BOOKS), 1, fp));

}

Int file_output_book(FILE * fp, BOOKS * ptr){

Return(fwrite(ptr, sizeof(BOOKS), 1, fp));

}

Void main(void){

Int ch;

Clrscr();

// by chars

Printf("1. Copying by chars from stdin to stdout... (Ctlr+Z to finish) ");

While((ch = getchar()) != EOF)

Putchar(ch);

// by lines

Char string[256];

Int line_number = 0;

FILE * fptr;

Printf(" 2. Copying by lines from <testread. txt> to stdout... ");

If((fptr = fopen("testread. txt", "r")) != NULL){

For(; fgets(string,255,fptr) != NULL; line_number++)

Fputs(string, stdout);

Printf(" Read %d lines of file <testread. txt> ", line_number);

Fclose(fptr);

}

Else

Printf(" File not open! ");

// by block

FILE *b_in, *b_out;

BOOKS *b_ptr;

Printf(" 3. Copying by blocks from <books. txt> to <books2.txt> (1 block = 104 bytes) ");

If ((b_in = fopen("books. txt","r"))!= NULL){

B_out = fopen("books2.txt","w");

File_input_book(b_in, b_ptr);

File_output_book(b_out, b_ptr);

Fclose(b_in);

Fclose(b_out);

}

Else

Printf(" File 'books. txt' not open! ");

//formated

FILE * fp;

Int i, num;

Printf(" 4. Formated read &; write. ");

If((fp = fopen("square. txt", "wb")) == NULL){

Printf(" File 'square. txt' not open! "); exit(1);

}

For(i=1; i < 10; i++) if(fprintf(fp,"%d ",i*i) == 0)

Printf("File write error");

Freopen("square. txt", "r", fp);

For(i = 1; i < 10; i++){

Fscanf(fp,"%d",&;num);

Printf("%d * %d = %u ", i, i, num);

}

Fclose(fp);

}

#define STOP_STRING ""

#define BUFFER_SIZE 128

#define KEY_SIZE 16

#include <stdio. h>

#include <string. h>

#include <errno. h>

Struct file_record {

Long offset;

Char indicator;

Unsigned key_length;

Unsigned length;

} work;

Main(){

Char *argv="database. dat";

FILE * fptr;

Int in_lines;

Int file_lines;

Char key[KEY_SIZE];

Char buffer[BUFFER_SIZE];

Fpos_t f_ptr;

If((fptr = fopen(argv, "a+b")) == NULL){

Perror("ЋиЕЎЄ ®вЄалвЕп д ©" ");

Return(2);

}

Fseek(fptr, 0L, SEEK_END);

If(!ftell(fptr)){

File_lines = 0;

If(!fwrite(&;file_lines, 2, 1, fptr)) return(3);

}

Else{

Fseek(fptr, 0L, SEEK_SET);

If(!fread(&;file_lines, 2, 1, fptr)) return(3);

Fseek(fptr, 0L, SEEK_END);

}

Printf(" ‚ д ©"Г § ЇЕб ­® %d бва®Є. "

"Џ®¦ "г©бв, ўў®¤ЕвГ ­®ўлГ бва®ЄЕ "

"""п § ўГаиГ­Еп ўў®¤ ўўГ¤ЕвГ Їгбвго бва®Єг. ",

File_lines);

Fflush(stdin);

For(in_lines=0; strcmp(gets(buffer),STOP_STRING);){

Strcpy(key, " ");

Printf("‚ўГ¤ЕвГ Є"оз § ЇЕбЕ (15 бЕў®"®ў): ");

Fflush(stdin);

Fgets(key, 15, stdin);

Work. length = strlen(buffer);

Work. key_length = strlen(key);

If(*(key + work. key_length -1) == ' ')

Work. key_length--;

Work. offset = ftell(fptr) + work. length +

Work. key_length +

Sizeof(struct file_record);

Work. indicator = 'B';

If(!fwrite(&;work, sizeof(struct file_record), 1, fptr))

Break;

If(!fwrite(key, work. key_length, 1, fptr))

Break;

If(!fwrite(buffer, work. length, 1, fptr))

Break;

In_lines++;

Fflush(stdin);

}

If(in_lines){

File_lines += in_lines;

F_ptr = ftell(fptr);

Fclose(fptr);

Fopen(argv, "r+b");

Fseek(fptr, 0, SEEK_SET);

If(!fwrite(&;file_lines, 2, 1, fptr)) in_lines = 0;

Fsetpos(fptr, &;f_ptr);

}

Printf("ЏpЕГ бвp®Є § ўГpиГ­ ");

Printf("ЏpЕ­пв® %d бвp®Є: ‚бГЈ® ў д ©"Г бв "® %d бва®Є ",

In_lines, file_lines);

Fclose(fptr);

Return(0);

}

#include <io. h>

#include <stdio. h>

#include <dos. h>

#include <fcntl. h>

#include <sysstat. h>

Int main(void){

Int handle;

Unsigned segment;

Char string [512] = "'Гбв®ў п бвp®Є ¤"п § ЇЕбЕ ў д ©"";

// read file

If((handle = _creat("rd-wr. txt",FA_ARCH|FA_SYSTEM|FA_HIDDEN)) == -1){

Printf("ЋиЕЎЄ ®вЄpлвЕп д ©" 'rd-wr. txt' ");

Perror("ЏpЕзЕ­ ®иЕЎЄЕ");

Return (2);

}

Write(handle, string, sizeof(string));

Read(handle, string, 512);

Write(1, string, 512);

Close(handle);

// open file

If ((handle = open("dumpmem. dat", O_TRUNC|O_CREAT|O_WRONLY|O_TEXT, S_IWRITE)) ==-1){

Printf("ЋиЕЎЄ ®вЄpлвЕп д ©" 'dumpmem. dat' ");

Return(1);

}

// write to file

For(segment = 0; segment < 0x8000; segment += 0x1000){

If(_write(handle, (char far *)MK_FP(segment, 0), 0xffff) == 0){

Perror("aЋиЕЎЄ § ЇЕбЕ ў® ўаГГ­­л© д ©"");

Return(2);

}

If(_write(handle, (char far *)MK_FP(segment, 0xffff), 1) == 0){

Perror("aЋиЕЎЄ § ЇЕбЕ ў® ўаГГ­­л© д ©"");

Return(2);

}

}

Printf(" ‚лЇ®"­Г­ ¤ Ї 512Љ Ў ©в Ї пвЕ ў д ©" 'dumpmem. dat' ");

}

Похожие статьи




Лабораторна робота №2 - Ввід інформації з клавіатури. Обмін інформації з файлами засобами мови Turbo C

Предыдущая | Следующая