Senza problemi. Ti posto la funzione che uso per scrivere il file codificato. Questa è una versione modificata per delle mie prove salvando il file sia in versione binaria che non poichè volevo vedere la differenza di peso.
codice:
void huffman::creazioneFileCodificato(string nome_file_lettura) {
string nome_file_scrittura; //Nome del file da scrivere
//Visualizzazione per l'input del nome file
cout << endl << "Digita il nome del file codificato tramite Huffman, comprensivo di estensione:" << endl;
cin >> nome_file_scrittura; cout << endl; //Acquisizione nome del file
//Apertura del file da leggere e da scrivere
ifstream file_da_codificare2;
file_da_codificare2.open(nome_file_lettura, ios::binary);
ofstream file_codificato;
file_codificato.open(nome_file_scrittura, ios::out | ios::binary);
ofstream file_codificato2;
file_codificato2.open("codifica_non_binaria.txt", ios::out | ios::binary);
//Questo costrutto controlla se c'è fallimento nell'apertura del file (ad esempio non lo trova) e termina il programma
if (file_da_codificare2.fail())
{
cout << "Errore durante l'apertura del file da codificare." << endl;
system("pause");
exit(EXIT_FAILURE);
}
//Dichiarazione di 1 carattere e lettura
char car;
char segno1[3] = "?^";
char segno2[3] = "^?";
file_da_codificare2.get(car);
int contatore = 0;
while (contatore < 256) {
if(getElementoMappa_codifiche(contatore) != "") {
string codifica = getElementoMappa_codifiche(contatore);
int s = codifica.size();
file_codificato2 << "?^" << contatore << "^?" << getElementoMappa_codifiche(contatore);
file_codificato.write((char *) &segno1, 3);
file_codificato.write((char *) &contatore, sizeof(int));
file_codificato.write((char *) &segno2, 3);
file_codificato.write((char *) &codifica, s);
}
contatore++;
}
/*Salvo la codifica nel file di destinazione, alternando 2 simboli che mi interesseranno
in seguito per riottenere la codifica nel file decomprimi.cpp*/
char segno3[5] = "?@@@";
file_codificato2 << "?@@@"; //Terminatore della codifica, dopo ci sarà il file codificato
file_codificato.write((char *) &segno3, 5);
//Ciclo che legge byte x byte, cerca la codifica corrispondente e salva la stringa codificata nell'output
while(!file_da_codificare2.eof()) //Termina con la fine del file
{
//iter=getMappa_codifiche().find(car); //Cerca il byte nella mappa
//contatore2+=iter->second.size(); //Conta i bit che spenderemo per i caratteri codificati (size è per string)
aumentaPesobitcompresso(getElementoMappa_codifiche(car).size());
string codifica = getElementoMappa_codifiche(car);
int s = codifica.size();
//if(iter!=getMappa_codifiche().end()) //Se non arriva alla fine, ha trovato la corrispondenza
file_codificato2 << getElementoMappa_codifiche(car); //Scrive il valore codificato
file_codificato.write((char *) &codifica, s);
file_da_codificare2.get(car); //Lettura carattere successivo
}
if (file_codificato.fail())
{
cout << "Errore durante la creazione del file compresso." << endl;
system("pause");
exit(EXIT_FAILURE);
}
cout << "File codificato creato correttamente." << endl;
system("pause");
cout << endl; //2 volte a capo
//Chiusuera lettura e scrittura
file_da_codificare2.close();
file_codificato.close();
}