Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторн_робот_Ч2.doc
Скачиваний:
19
Добавлен:
03.11.2018
Размер:
2.12 Mб
Скачать

Void wait(port)

Int port;

{

if(rport(port)!='.') {

printf("помилка встановлення зв'язку \n");

exit(1);

}

}

Таким чином, при виявленні помилки ця функція припиняє свою роботу. Однак можна передбачити обробку даної ситуації.

Функція filesize() повертає розмір файлу в байтах. Її використання можливо, якщо компілятор Сі підтримує функцію обчислення довжини файлу, у протилежному випадку потрібно замінити цю функцію розробленою вами, але виконуючу аналогічні дії. Змінна cnt, що входить до складу структури union, служить для збереження двобайтової довжини файлу, але потрібно пам'ятати, що за одиницю часу можна переслати через послідовний порт тільки один байт.

Прийом файлу

Прийом файлу є прямо протилежною операцією передачі файлу. По-перше, функція прийому очікує маркера запиту на одержання даних (символ ‘?’). На одержання маркера функція відповідає крапкою (символом квітування). Після одержання імені файлу функція очікує одержання його розміру в байтах. В остаточному підсумку функція починає читання файлу. Після одержання і читання кожного байта функція посилає комп’ютерові-джерелу квітуючий байт. У такий спосіб вона реалізує програмне підтвердження зв’язку. Функція rec_file() представлена нижче.

/* Прийом файлу */

Void rec_file()

{

FILE *fp;

char ch;

char fname[14];

union {

char c[2];

unsigned int count;

} cnt;

get_file_name(fname); /* одержання імені файлу */

printf(„ Отриманий файл %s\n”,fname);

remove(fname);

if(!(fp=fopen(fname, „wb”))) {

printf(„ Неможливо відкрити вихідний файл \n”);

exit(1);

}

/* Одержання довжини файлу */

sport(PORT, ‘.’); /* квітування */

cnt.c[0] = rport(PORT);

sport(PORT, ‘.’); /* квітування */

cnt.c[1] = rport(PORT);

sport(PORT, ‘.’); /* квітування */

for(; cnt.count; cnt.count--) {

ch = rport(PORT);

putc(ch, fp);

If(ferror(fp)) {

printf(„ помилка запису у файл „);

exit(1);

}

sport(PORT, ‘.’); /* квітування */

}

fclose(fp);

}

Функція get_file_name() представлена нижче.

/* Одержання імені файлу */

Void get_file_name(f)

char *f;

{

printf(„Чекання одержання...\n”);

while(rport(PORT)!=’?’) ;

sport(PORT, ‘.’); /* квітування */

while((*f=rport(PORT))) {

if(*f!=’?’) {

f++;

sport(PORT, ‘.’); /* квітування */

}

}

}

  1. Приклад розв’язання задачі на еом (варіант 10)

Дана програма буде складатися з основної функції int main(), та двох функцій для виконання поставленої задачі:

void EnterData (const char *file_name) – призначена для перезапису даних в файлі.

int GetLinesCount(const char *file_name) – призначена для підрахунку кількості стрічок двійкового файлу.

    1. Розробка тексту програми

#include <stdio.h>

#include <conio.h>

#include <string.h>

void EnterData (const char *file_name);

int GetLinesCount(const char *file_name);

/*

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

*/

void EnterData(const char *file_name)

{

FILE *f; // file variable

f = fopen(file_name,"wb");

if(f)

{

char str[100];

printf("Please enter data:\n");

do

{

gets(str);

if( strlen(str) == 0 )

break;

fprintf(f, "%s\n", str);

}while(1);

fclose(f);

}

}

int GetLinesCount(const char *file_name)

{

FILE *f;

f = fopen(file_name,"rb");

if(f)

{

char ch;

int k = 1;

while( !feof(f) )

{

fread(&ch, 1, 1, f);

if( ch == 10 )

k++;

}

fclose(f);

return k; }

printf("Cannot open file");

return 0;

}

void main()

{

clrscr();

int h;

char file_name[] = {"1.txt"};

h=GetLinesCount(file_name);

printf("k=%d",h);

getch();

}

3.2 Результати роботи програми

Для перевірки правильності роботи програми безпосередньо введемо до текстового файлу „ 1.txt деяку інформацію, наприклад запишемо:

Ukraine

Ne xo4y v armijy

ale pidy

Slyjy Ukraini

Видно, що файл містить чотири стрічки.

Тоді запустимо програму і бачимо, що в файлі „ 1.txt ” кількість стрічок:

k=4.