Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ООП / ООП / oop-ekz-tasks / 7 семинар 2

.doc
Скачиваний:
12
Добавлен:
18.02.2017
Размер:
47.1 Кб
Скачать

Задание к семинару 6 «Файловые потоки». Произведите конвертацию (преобразование) текстовых данных в различные форматы, запрограммировав классы SrcCreate и SrcConvert.

Запрограммируйте класс SrcCreate, чтобы при следующих обращениях к объекту этого класса в файле src.txt были получены текстовые сообщения в шестнадцатеричном (hex) формате. При уничтожении объекта src файл src.txt закрывается.

{

SrcCreate src("src.txt",42);

src.AddMsg("Hello!"); //см. ниже: 48 65 6C 6C 6F 21

src.AddMsg("Hi Friend!"); //см. ниже: 48 69 20 46 72 69 65 6E 64 21

src.AddMsg("How are you?");

src.AddMsg("I'm fine, and you?");

src.AddMsg("Bye!");

src.AddMsg("Have a nice time!!!");

}//чтобы сработал деструктор src

В результате формируется файл src.txt со следующим содержанием, причем ширина строк составляет 42 символа (без учета длины префиксов строк «Rx: » или «Tx: »). Сообщение первого собеседника указывается в строке Rx (прием), второго – в строке Tx (передача); пустые места замещаются пробелами; если сообщение не умещается на одной строке, оно переносится на следующую строку с сохранением режима Rx или Tx.

Rx: 48 65 6C 6C 6F 21

Tx: 48 69 20 46 72 69 65 6E

Rx: 48 6F 77 20 61 72 65 20 79 6F 75 3F

Tx: 64 21

Rx:

Tx: 49 27 6D 20 66 69 6E 65 2C 20 61 6E 64 20

Rx: 42 79 65 21

Tx: 79 6F 75 3F 48 61 76 65 20 61

Rx:

Tx: 20 6E 69 63 65 20 74 69 6D 65 21 21 21

После выполнения программной строки SrcConvert dst("src.txt","dst.txt"); из файла src.txt формируется новый файл dst.txt, содержание которого указано ниже. Сначала указывается направление (Src – источник, Dst – приемник), затем дамп из 16-ти hex-кодам; если чисел меньше, строка дополняется пробелами для выравнивания; далее следуют символы, соответствующие hex-кодам. Если символ строго больше пробела, то указывается его изображение, если меньше – то точка (в примере пробел отображен точкой).

Src->Dst

48 65 6C 6C 6F 21 Hello!

Src<-Dst

48 69 20 46 72 69 65 6E 64 21 Hi.Friend!

Src->Dst

48 6F 77 20 61 72 65 20 79 6F 75 3F How.are.you?

Src<-Dst

49 27 6D 20 66 69 6E 65 2C 20 61 6E 64 20 79 6F I'm.fine,.and.yo

75 3F u?

Src->Dst

42 79 65 21 Bye!

Src<-Dst

48 61 76 65 20 61 20 6E 69 63 65 20 74 69 6D 65 Have.a.nice.time

21 21 21 !!!

#include <iostream>

#include <string.h>

#include <stdio.h>

using namespace std;

class SrcCreate

{

private:

bool Rxnow;

char tRx[42];

int indx;

char tTx[42];

FILE *fin;

int size;

int iRx, iTx;

public:

SrcCreate(char* p, int _size);

void AddMsg(char* p);

~SrcCraete();

};

class SrcConvert

{

FILE* fin;

FILE* fout;

char tRx[42];

char tTx[42];

char cRx[42];

char cTx[42];

bool Rxnow;

int indx;

char* Rx;

char* Tx;

public:

SrcConvert(char *p1, char *p2);

};

SrcCreate::SrcCraete(char *p, int _size)

{

fin=fopen(p,"rt");

size=_size;

Rxnow=1;

iRx=0;

iTx=0;

}

char* Get16Code(char c)

{

char p[2];

int a=c;

if(a/16<10)

p[0]=a/16-'0';

else

if(a/16==10)

p[0]='A';

else

if(a/16==11)

p[0]='B';

else

if(a/16==12)

p[0]='C';

else

if(a/16==13)

p[0]='D';

else

if(a/16==14)

p[0]='E';

else

if(a/16==15)

p[0]='F';

if(a%16<10)

p[1]=a%16-'0';

else

if(a%16==10)

p[1]='A';

else

if(a%16==11)

p[1]='B';

else

if(a%16==12)

p[1]='C';

else

if(a%16==13)

p[1]='D';

else

if(a%16==14)

p[1]='E';

else

if(a%16==15)

p[0]='F';

return p;

}

char Code16Char(char* p)

{

char c;

if(p[0]=='A')

c=c+10*16;

if(p[0]=='B')

c=c+11*16;

if(p[0]=='C')

c=c+12*16;

if(p[0]=='D')

c=c+13*16;

if(p[0]=='E')

c=c+14*16;

if(p[0]=='F')

c=c+15*16;

if(p[0]<='9' && p[0]>='0')

c=c+(p[0]-'0')*16;

if(p[1]=='A')

c=c+10;

if(p[1]=='B')

c=c+11;

if(p[1]=='C')

c=c+12;

if(p[1]=='D')

c=c+13;

if(p[1]=='E')

c=c+14;

if(p[1]=='F')

c=c+15;

if(p[1]<='9' && p[1]>='0')

c=c+(p[1]-'0');

return c;

}

void SrcCreate::AddMsg(char *p)

{

for(int i=0;i<strlen(p);i++)

{

if(indx==42)

{

fputs(tRx,fin);

fputs(tTx,fin);

tTx="";

tRx="";

indx=0;

}

if(Rxnow && indx<42)

{

tRx=tRx+Get16Code(p[i])+' ';

tTx=tTx+" ";

indx+=3;

}

if(!Rxnow && indx<42)

{

tTx=tTx+Get16Code(p[i])+' ';

tRx=tRx+" ";

indx+=3;

}

}

if(Rxnow) Rxnow=0; else Rxnow=1;

}

SrcCreate::~SrcCreate()

{

fclose(fin);

}

SrcConvert::SrcConvert(char *p1, char *p2)

{

fin=fopen(p1,"rt");

fout=fopen(p2,"wt");

Rx="";

Tx="";

cRx="";

cTx="";

char tmp[2];

while(!eof)

{

fgets(tRx,42,fin);

fgets(tTx,42,fin);

if(tRx[0]==' ') Rxnow=0; else Rxnow=1;

for(int i=0;i<42;i+=3)

{

if(Rxnow)

{

tmp[0]=tRx[i];

tmp[1]=tRx[i+1];

cRx=cRx+tmp+' ';

if(Code16Char(tmp)>' ')

Rx=Rx+Code16Char(tmp);

else

Rx=Rx+'.';

if(tRx[i+2]==' ')

{

fputs("Src->Dst",fout);

for(int i=strlen(cRx);i<42;i++)

cRx=cRx+' ';

cRx=cRx+Rx;

fputs(cRx,fout);

Rxnow=0;

}

}

if(!Rxnow)

{

tmp[0]=tTx[i];

tmp[1]=tTx[i+1];

cTx=cTx+tmp+' ';

if(Code16Char(tmp)>' ')

Tx=Tx+Code16Char(tmp);

else

Tx=Tx+'.';

if(tTx[i+2]==' ')

{

fputs("Src->Dst",fout);

for(int i=strlen(cTx);i<42;i++)

cTx=cTx+' ';

cTx=cTx+Tx;

fputs(cTx,fout);

Rxnow=0;

}

}

}

}

}

int main()

{

SrcCreate src("src.txt",42);

src.AddMsg("Hello!");

src.AddMsg("Hi Friend!");

src.AddMsg("How are you?");

src.AddMsg("I'm fine,and you?");

src.AddMsg("Bye!");

src.AddMsg("Have a nice time!!!");

Src.~SrcCreate();

SrcConvert dst("src.txt","dst.txt");

return 0;

}

Соседние файлы в папке oop-ekz-tasks