00001
00002 #include "IOl.h"
00003
00004
00005
00006
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
00017
00018
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
00028
00029
00030
00031
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
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
00080
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