Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213

    [C++] Codifica di Huffman

    Sono ancora qui a chiedere un consiglio.
    Ho implementato l'algoritmo della codifica e decodifica di Huffman e sembra che tutto funzioni correttamente.

    Sembra, perchè stranamente i file che mi genera codificati pesano molto di più di quelli originali. Logicamente ci può anche stare siccome il file codificato contiene sia la parte iniziale riguardante la codifica (per poterlo ricostruire) e sia la parte finale che contiene il file codificato.

    Ho provato a salvare file sia in maniera binaria che non ma non è cambiato nulla. Secondo voi dovrei trovare qualche altra soluzione affinchè mi generi file che pesino meno degli originali o l'importante è che la parte codificata sia giusta e meno grossa (nel programma già controllo che questa richieda meno bit per memorizzarla)?

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Di solito questi sistemi usano una codifica a bits e non bytes. Se dici che tutto sommato il codice che tu hai usato funziona correttamente, l'errore più probabile potrebbe essere proprio quello di non usare i bits ma i bytes. Dovresti postare il tuo codice
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213
    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();
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.