|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
[C] compressione file con tecnica rle
Salve a tutti, dovrei scrivere un programma che comprimi un file .txt e che sarà chiamato con l'estensione .rle, mediante la tecnica dell'rle. Credo di aver capito all'incirca come l'algoritmo è definito, ma non riesco ad implementarlo, cioè non riesco a prendere l'input di tutto il file ( in byte ) e contare e vedere se si ripetono, qualcuno potrebbe darmi un consiglio?
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
nessuno può darmi una mano a capire??
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12900
|
Per contare se i caratteri si ripetono potresti usare un array con 255 posizioni, una per ogni carattere.
Codice:
int NumeroCaratteri[ 255 ]; Codice:
while( EsistonoCaratteriDaLeggere )
{
char CarattereCorrente = EstraiCarattereCorrente();
NumeroCaratteri[ CarattereCorrente ] += 1;
}
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
Quote:
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
vorresti dire che è la stessa cosa delle stringhe?
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
scusate un altra cosa non riesco a fare.... come faccio a cambiare l'estensione del file??
Codice:
rename(argv[1]".rle",fp2); poi l'algoritmo deve anteporre il numero di volte davanti al carattere che si ripete, ma come diavolo faccio?? è un pò che sbatto la testa su questo programma ma sinceramente non riesco proprio a scriverlo... una mano sarebbe più che gradita.
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
e ma dopo la lettura? come faccio a contare se si ripete ogni singolo carattere e poi inserirlo nel file stesso?!!
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Aug 2001
Città: Milano
Messaggi: 402
|
rename(argv[1]".rle",fp2); ....ci sei quasi
Che poi...scusa...perchè rinominare il file ? Non ha molto senso se lo devi comprimere, dovresti crearne uno nuovo con l'estensione diversa. Prima di tutto come funziona l'RLE...comprime sostituendo le sequenze uguali di caratteri adiacenti con un marcatore di riconoscimento + il numero delle volte da ripete + il carattere da ripetere Esempio : - il file contiene AAAAACAAA - il tuo marcatore sarà ? - dopo la compressione avrai ?5AC?3A ...se qualcuno che mi conosce vede questo esempio mi prendono x il culo per decenni Questa è la spiegazione più semplice che mi viene, lontana dall'essere perfetta visto che l'utilizzo di un marcatore in quel modo è da evitare ma non vedo soluzioni più eleganti. Pseudo algoritmo : Codice:
NumeroRipetizioni = 0
Minimo = 3
Routine RLE
Se CharAttuale <> CharPrecedente
Se NumeroRipetizioni > Minimo
Scrivi marcatore
Scrivi NumeroRipetizioni
Scrivi CharPrecedente
NumeroRipetizioni = 0
FineSe
Ciclo NumeroRipetizioni > 0
Scrivi CharPrecedente
NumeroRipetizioni - 1
FineCiclo
CharPrecedente = CharAttuale
FileSe
FineRoutine
Ciclo !EOF
Leggi CharAttuale
Esegui RLE
NumeroRipetizioni + 1
FineCiclo
Esegui RLE
P.S. Spero per te che non dovrai mai vedertela con algoritimi di compressione aritmetica o peggio
__________________
Phenom 2 555 X2@X4@3,6Ghz 1.33v Asus M4A785TD-V EVO 4GB Team Group Elite 1333Mhz AC Freezer Xtreme Corsair 450VX Samsung SyncMaster T220 Hd Seagate 500x2(Raid 0) Barton 2500+@3200+ vcore 1.550 (liquid cooled@+9° T.A.) Asus A7N8X-E Dlx 1Gb Ram Dual DDR Hd Maxtor SATA 160x2(Raid 0) GeXCube 9600XT Eizo 19P Le belle cose hanno un inizio e una fine...tutto il resto è la normalità |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
Quote:
L'RLE ormai l'avevo capito come algoritmo ma ti ringrazio per la spiegazione, il problema è proprio implementarlo con i file, ora provo meglio, visto che mi hai scritto anche in pseudocodice e mi hai dato una mano grandissima, anche se ho ancora numerosissimi dubbi a riguardo, a partire proprio dall'estensione che viene cambiata del file!
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Aug 2001
Città: Milano
Messaggi: 402
|
Sono secoli che non uso più il C quindi magari è sbagliato ma ricordo una roba tipo :
Codice:
strcpy(OutputFileName, argv[1]); -- Aggiungge l'estensione al file strcat(OutputFileName, ".rle"); pos = strrchr(argv[1], '.')-argv[1]; -- Cambia l'estensione al file strncpy(OutputFileName, argv[1], pos); OutputFileName[pos + 1] = '\0'; strcat(OutputFileName, ".rle");
__________________
Phenom 2 555 X2@X4@3,6Ghz 1.33v Asus M4A785TD-V EVO 4GB Team Group Elite 1333Mhz AC Freezer Xtreme Corsair 450VX Samsung SyncMaster T220 Hd Seagate 500x2(Raid 0) Barton 2500+@3200+ vcore 1.550 (liquid cooled@+9° T.A.) Asus A7N8X-E Dlx 1Gb Ram Dual DDR Hd Maxtor SATA 160x2(Raid 0) GeXCube 9600XT Eizo 19P Le belle cose hanno un inizio e una fine...tutto il resto è la normalità |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
Quote:
ora impresa difficile sarà continuare il programma
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:23.




















