Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h> /* printf */
- #include <stdlib.h>
- #include <string>
- #include <iostream>
- #include <math.h>
- #include "main.h"
- LZW::LZW(std::string fileName){
- FILE * file;
- file = fopen (fileName.c_str(),"r");
- if (file==NULL) perror ("Error opening file");
- else{
- fseek(file, 0, SEEK_END); // seek to end of file
- textLength = ftell(file); // get current file pointer
- fseek(file, 0, SEEK_SET); //back to the beginning of the file
- printf("Textlength: %d",textLength);//JAJ variable text längen!
- printf("\n");
- text=new char[textLength];
- for(int i=0;i<(textLength);i++){
- text[i] = fgetc (file);//Char für char ausm text fischen
- printf("%c",text[i]);//Ausgabe der soeben eingelesenne Chars
- //if((i%50)==0) printf("\n");
- }
- fclose (file);
- }
- alphabetLength=256;
- alphabet = new char[alphabetLength];
- vorkommen = new int[alphabetLength];
- wahrscheinlichkeit = new float[alphabetLength];
- entscheidungsgehalt = new float[alphabetLength];
- printf("\nVorhandenes Alphabet:\n");
- for (int i=0; i<alphabetLength; i++){
- char temp = i;
- alphabet[i] = temp;
- printf("%c",alphabet[i]);
- }
- codiertInt = new int[textLength];
- for(int i=0;i<textLength;i++){
- codiertInt[i]=0;
- }
- }
- LZW::~LZW(){
- delete text;
- delete alphabet;
- delete vorkommen;
- delete wahrscheinlichkeit;
- delete entscheidungsgehalt;
- printf("Off");
- }
- void LZW::Entropie(){
- // array sauber machn warum auch immer es ohne nicht ging^^
- for(int i=0;i<alphabetLength;i++){
- vorkommen[i]=0;
- wahrscheinlichkeit[i]=0;
- entscheidungsgehalt[i]=0;
- }
- for (int i=0;i<textLength;i++){
- for(int j=0;j<alphabetLength;j++){
- if (text[i]==alphabet[j]){
- vorkommen[j]++;
- }
- }
- }
- for (int i=0;i<alphabetLength;i++){
- wahrscheinlichkeit[i]=(float)vorkommen[i]/(float)textLength;
- }
- for (int i=0;i<alphabetLength;i++){
- entscheidungsgehalt[i]=log2(1/(float)wahrscheinlichkeit[i]);
- }
- entropie=0;
- for (int i=0;i<alphabetLength;i++){
- entropie=entropie+(entscheidungsgehalt[i]*wahrscheinlichkeit[i]);
- }
- // Ausgabe von Alphabet un dden dazugehörigen berechneten werten
- for (int i=0;i<alphabetLength;i++){
- if(vorkommen[i]!=0){//Filtern der nicht vorkommenden zeichen
- printf("\n%d",i);
- printf(" - %c",alphabet[i]);
- printf(" - %u",vorkommen[i]);
- printf(" - %f",wahrscheinlichkeit[i]);
- // printf(" - %f",entscheidungsgehalt[i]);
- }
- }
- // printf("\nEntropie: %f",entropie,"\n");
- }
- bool LZW::musterVorhanden(std::string zuTestendesMuster){
- // printf("Suche nach muster");
- for(int i=0;i<musterCounter-1;i++){
- if(zuTestendesMuster.compare(muster[i])==0){
- // printf(" %d",i);
- lastTestedMuster=i;
- return true;//Muster vorhanden
- }
- // printf("F%d",i);
- }
- return false;// Muster nicht vorhanden
- }
- void LZW::codieren(){
- printf("\nEs wird versucht zu codieren\n");
- std::string temp1="";
- std::string temp2="";
- int counter=0;
- int musterBuffer=1024;
- codierteTextLength=0;
- muster = new std::string[musterBuffer];
- for (int i=0;i<alphabetLength;i++){
- muster[i]=alphabet[i];
- }
- lastTestedMuster=0;
- musterCounter=alphabetLength;//ASCII Alphabet wird als muster betrachetet
- while(counter<=textLength){
- temp1=temp2+text[counter];
- if(musterVorhanden(temp1)){
- counter++;
- temp2=temp1;
- }else if(!musterVorhanden(temp1)){
- muster[musterCounter]=temp1;
- // printf(" Neues muster angelegt: %s",temp1.c_str());
- // printf(" %u",musterCounter);
- musterCounter++;
- printf(" %u",lastTestedMuster);
- codiertInt[codierteTextLength]=lastTestedMuster;
- codierteTextLength++;
- if(musterCounter==musterBuffer)musterCounter=alphabetLength;
- temp2="";
- }
- }
- // printf("\nVorhande Muster: \n");
- for (int i=0;i<musterCounter;i++){
- // printf(" %d",i);
- // printf(" - %s",muster[i].c_str());
- }
- printf("\nCodierte Zeichen: \n");
- printf("%d",codierteTextLength);
- }
- bool LZW::decodeMusterVorhanden(std::string zuTestendesMuster){
- // printf("Suche nach muster");
- for(int i=0;i<decodeMusterCounter-1;i++){
- if(zuTestendesMuster.compare(decodeMuster[i])==0){
- // printf(" %d",i);
- lastTestedMuster=i;
- return true;//Muster vorhanden
- }
- // printf("F%d",i);
- }
- return false;// Muster nicht vorhanden
- }
- void LZW::decodieren(){
- printf("\nEs wird versucht zu decodieren\n");
- std::string temp1="";
- std::string temp2="";
- std::string decodiert="";
- int counter=0;
- int counter2=0;
- int decodeMusterBuffer=1024;
- decodeMusterCounter=alphabetLength;
- decodeMuster = new std::string[decodeMusterBuffer];
- for (int i=0;i<alphabetLength;i++){
- decodeMuster[i]=alphabet[i];
- }
- while(counter<=textLength){
- // printf(" ->%d",codiertInt[counter2]);
- if(codiertInt[counter2]<=decodeMusterCounter-1&&counter2<codierteTextLength-1){
- decodiert=decodiert+decodeMuster[codiertInt[counter2]];
- // printf("\nMuster bekannt decodiere:%s ",decodeMuster[codiertInt[counter2]].c_str());
- counter2++;
- }
- temp1=temp2+decodiert[counter];
- if(decodeMusterVorhanden(temp1)){
- counter++;
- temp2=temp1;
- }else if(!decodeMusterVorhanden(temp1)){
- decodeMuster[decodeMusterCounter]=temp1;
- // printf(" Neues muster angelegt: %s",temp1.c_str());
- // printf(" %u",decodeMusterCounter);
- decodeMusterCounter++;
- if(decodeMusterCounter==decodeMusterBuffer)decodeMusterCounter=alphabetLength;
- temp2="";
- }
- }
- printf("\ndecodierter text: \n");
- printf("%s",decodiert.c_str());
- // printf("\nVorhande Muster: \n");
- for (int i=0;i<decodeMusterCounter;i++){
- // printf(" %d",i);
- // printf(" - %s",decodeMuster[i].c_str());
- }
- }
- int main(){
- LZW lzw("Textbeispiel2.txt");
- lzw.Entropie();
- lzw.codieren();
- lzw.decodieren();
- char c;
- scanf("%c", &c); // Ende
- }
Advertisement
Add Comment
Please, Sign In to add comment