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

00001 
00002 #include "IOs.h"
00003 
00004 /*questo è il costruttore, che collega lo stream contenuto nella classe al
00005   file specificato, scrivendo direttamente sul file la codifica adottata*/
00006 
00007 IOs::IOs(const char* file,frequenza** v,int n)
00008 {
00009 stream.open(file, ios::out | ios::binary);
00010 if (!stream) throw "apertura";
00011 for (int i = 0; i < 8; i++)
00012     buffer[i] = 0;
00013 contatore = 0;
00014 stream.put (char(n-1));
00015                     //memorizzo anche il numero di caratteri distinti presenti
00016                     //nel file in modo da agevolare la decodifica, notare che
00017                     //lo stampo sottoforma di carattere, in modo da risparmiare
00018                     //i byte necessari per inserire un intero
00019 for (int i = 0; i < n; i++)
00020     {
00021     stream.put(v[i] -> c);
00022     stream << v[i]->freq;
00023     if (i != n-1) stream << '-';
00024     if (i == n-1) stream << '|';
00025     }
00026 }      
00027 
00028 IOs::~IOs()
00029 {
00030 stream.close();
00031 }
00032 
00033 /*questa funzione serve per la scrittura di stringhe già compresse, i singoli
00034 bit della codifica vengono inseriti un un buffer che, quando ha acquisito 8 bit,
00035 li stampa come un carattere*/
00036 
00037 void IOs::inserisci (int b)
00038 {
00039 buffer[contatore++] = b;
00040 if (contatore > 8) throw "contatore";
00041 if (contatore == 8)
00042     {
00043     int c = 0;
00044     for (int i = 0; i < 8; i++)
00045         if (buffer[i])
00046            c += elevato (2, (7-i));
00047     stream.put(char (c));
00048     /*char a = char(c);
00049     stream.write(&a, 1);*/
00050     contatore = 0;
00051     }
00052 }
00053 
00054 /* se il testo, codificato, non ha dimensione multiplo di 8 bit è necessario
00055 svuotare il buffer anche se non vi sono effettivamente 8 bit all'interno, a 
00056 questo proposito si ha la funzione svuota */
00057 
00058 void IOs::svuota ()
00059 {
00060 if (contatore == 0) return;
00061 int c = 0;
00062 for (int i = 0; i < contatore; i++)
00063     c += elevato (buffer[i]? 2:0, (7-i));
00064 stream.put(char (c));
00065 /*char a = char(c);
00066 stream.write(&a, 1);*/
00067 contatore = 0;
00068 }
00069 
00070 /* funzione che eleva a potenza b un intero a */
00071 int IOs::elevato (int a, int b)
00072 {
00073 if (a == 0) return 0;
00074 int app = 1;
00075 for (int i = 0; i < b; i++)
00076     app *= a;
00077 return app;
00078 }

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