Desktop/Daniele/Program Editing/Progetto di informatica 2/componenti/IOl.cpp

00001 
00002 #include "IOl.h"
00003 
00004 /*vado ora a definire i metodi della classe IOl*/
00005 
00006 /* funzione che eleva a potenza b un intero a */
00007 int IOl::elevato (int a, int b)
00008 {
00009 if (a == 0) return 0;
00010 int app = 1;
00011 for (int i = 0; i < b; i++)
00012     app *= a;
00013 return app;
00014 }
00015 
00016 /*questa funzione è necessaria per come è implementata la traduzione da
00017 carattere a intero, infatti in certi casi i valori sono completamente
00018 errati, definisco questa funzione per operare direttamente sui bit*/
00019 int IOl::traduci (char c)
00020 {
00021 int a = 0;
00022 for (int i = 0; i < 8; i++)
00023     a = a + ((c >> (i)) & 1) * elevato(2,i);
00024 return a;
00025 }
00026 
00027 /*questo costruttore legge le prime informazioni relative alla codifica
00028 adottata, ossia il numero di diversi caratteri nella codifica, e le varie
00029 frequenze associate ad essi che serviranno al decodificatore per costruire
00030 l'albero di huffman corrispondente, il secondo e il terzo argomento verranno
00031 passati dal decodificatore stesso*/
00032 
00033 IOl::IOl(const char* file, frequenza**& pf, int& numero)
00034 {
00035 stream.open(file, ios::in | ios::binary);
00036 if (!stream) throw "apertura";
00037 for (int i = 0; i < 8; i++)
00038     buffer[i] = 0;
00039 char c;
00040 stream.get(c);
00041 if (!stream) throw "lettura";
00042 numero = traduci(c)+1;
00043 pf = new frequenza* [numero];
00044 if (!pf) throw "memoria";
00045 
00046 int a;
00047 int i;
00048 for (i = 0; i < numero && stream; i++)
00049     {
00050     c = char(stream.get());
00051     if (!stream) throw "lettura";
00052     stream >> a;
00053     stream.clear();
00054     if (!stream) throw "lettura";
00055     pf[i] = new frequenza;
00056     if (!pf[i]) throw "memoria";
00057     pf[i] -> c = c;
00058     pf[i] -> freq = a;
00059     pf[i] -> left = 0;
00060     pf[i] -> right = 0;
00061     c = char(stream.get());
00062     if (!stream) throw "lettura";
00063     if (c != '-' && i != numero-1) throw "lettura";
00064     if (c != '|' && i == numero-1) throw "lettura";
00065     if (c == '|' && i == numero-1)
00066        c = char (stream.get());
00067     }
00068 //esegue un primo riempimento del buffer con il carattere letto
00069 contatore = 0;
00070 for (int i = 0; i < 8; i++)
00071 buffer [i] = bool((c >> 7-i) & 1);
00072 }
00073 
00074 IOl::~IOl()
00075 {
00076 stream.close();
00077 }
00078 
00079 /*questa funzione amministra il buffer eseguendo nuove letture se ne abbiamo
00080 bisogno, e restituisce il prossimo bit della codifica*/
00081 
00082 int IOl::leggi()
00083 {
00084 if (contatore > 8) throw "contatore";
00085 if (contatore == 8)
00086     {
00087     contatore = 0;
00088     int c = -1;
00089     c = stream.get();
00090     if (c == -1)
00091        return -1;
00092     if (!stream) throw "lettura";
00093     for (int i = 0; i < 8; i++)
00094         buffer [i] = bool((c >> 7-i) & 1);
00095     }
00096 return buffer[contatore++];
00097 }
00098 
00099 
00100 
00101 
00102     
00103     

Generated on Sat May 20 14:57:56 2006 for Huffzip by  doxygen 1.4.6-NO