ООП / ООП / oop-ekz-tasks / 7 семинар 2
.docЗадание к семинару 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;
}