PDA

View Full Version : [C] Lettura caratteri da file


Zagor HW
01-06-2007, 18:10
Qual è, in assoluto, la funzione più veloce per leggere carattere per carattere da un file tra tutte quelle messe a disposizione dal C? Lo chiedo perché sto tentando di implementare l'algoritmo della codifica di Huffman, e quando vado a leggere file con una quantità elevata di caratteri, anche la lettura di un carattere deve risultare il più veloce possibile, o sbaglio?

Grazie

^TiGeRShArK^
01-06-2007, 18:23
ehmm...
non ti conviene leggere carattere per carattere ad occhio ma ti conviene leggere blocchi di byte se vuoi la massima velocità.
Se i file da codificare non sono troppo grandi mi sa ke ti conviene pure leggere prima tutto il file in una volta e lavorarci direttamente in menoria.
Altrimenti puoi procedere codificando per blocchi successivi (abbastanza grandi).

redcloud
01-06-2007, 18:56
Se non ricordo male, il modo più veloce per leggere una serie di caratteri da uno stream è usare la system call read impostando un buffer di 8192 byte.

Parlo di sistemi unix.

^TiGeRShArK^
01-06-2007, 19:08
Se non ricordo male, il modo più veloce per leggere una serie di caratteri da uno stream è usare la system call read impostando un buffer di 8192 byte.

Parlo di sistemi unix.

Mi sa che dipende dalla dimensione dei cluster ad occhio :p
Cmq nulla toglie di poter usare un multiplo di questa dimensione...
sempre se il mio ragionamento è giusto :p
conferme o smentite? :D

redcloud
01-06-2007, 19:33
Ero convinto anche io di questo fatto, ma queste informazioni le presi su un libro di programmazione su sistemi unix, in cui si spiega molto bene come dimensioni superiori a quella da ma indicata, sono semplicemente sprecate.

Zagor HW
02-06-2007, 17:10
Ok, ed in conclusione quale delle tante funzioni messe a disposizione dovrei usare?

ndakota
02-06-2007, 17:40
io non saprei ma dalle risposte degli altri direi fwrite

71104
02-06-2007, 19:18
ehmm...
non ti conviene leggere carattere per carattere ad occhio ma ti conviene leggere blocchi di byte se vuoi la massima velocità.
Se i file da codificare non sono troppo grandi mi sa ke ti conviene pure leggere prima tutto il file in una volta e lavorarci direttamente in menoria. se ragioniamo così allora può anche fare un file mapping fregandosene delle dimensioni eccessive del file :D
in effetti non mi pare una cattiva idea quella del file mapping... questa codifica di huffman (scusate la mia sonora ignoranza) che d'era? un algoritmo di compressione?

Zagor HW
02-06-2007, 19:53
Si, è un algoritmo usato per la compressione. Potreste fare anche qualche esempio pratico di codice in C? Perchè purtroppo non riesco a seguire molto questi vostre "indicazioni teoriche" e non saprei come trasformarle poi in codice.

Grazie

71104
02-06-2007, 22:08
purtroppo il modo di gestire file mappati in memoria (anche detti file mapping) è dipendente dalla piattaforma: su Windows è in un modo e su Linux in un altro. se però sei disposto a legarti ad una piattaforma allora credo che sia l'ipotesi migliore, anche perché spesso la dimensione di una pagina è un multiplo della dimensione di un cluster. in tal caso la domanda diventa: il programma deve girare su Windows, Linux o altro?

Zagor HW
03-06-2007, 11:41
Teoriacamente su windows, pero deve funzionare sulla shell cygwin, con compilatore GNU.

71104
03-06-2007, 14:29
non ho mai usato cygwin quindi a scanso di dire corbellerie ti espongo entrambi i casi:
* su Windows devi usare CreateFileMapping (http://msdn2.microsoft.com/en-us/library/aa366537.aspx) e MapViewOfFile (http://msdn2.microsoft.com/en-us/library/aa366761.aspx)
* su Linux mmap (http://www.linuxmanpages.com/man2/mmap.2.php)