Newsgroup: it.comp.lang.c++
Titolo: leggere dati binari

ho un file (nello specifico un file audio raw pcm 16 bit LSB...MSB) e devo
leggerne i dati.
ho provato a usare la funzione fread ma temo di non aver inteso bene le
istruzioni che ho trovato su internet.
allora io ho una variabile int sample[16]: devo leggere questi malnati
campioni a 16bit dal file ed inserirli in sample[0] che dovrà contenere un
campione.
io ho scritto:
fread (sample[0], 2, 1, fp1); //fp1 è l'input file pointer
ma se poi subito dopo io scrivo:
fwrite (sample[0], 2, 1, fp2); //fp2 è il file di output
quello che io ottengo non è la copia del file di origine.
può questo dipendere dal fatto che sample[0] è un int mentre i dati che sto
leggendo sono a 16bit? oppure visto che il prototype è fread (buffer, ...)
ho capito male cosa sia un buffer e lo sto usando in modo sbagliato?
altre domandina, e se invece i dati fossero a 24bit o float IEEE 32bit?
precisazione: il file pcm raw non contiene header di sorta e posso
formattare i dati sia LSB...MSB che MSB...LSB in fase di esportazione dal
programma di editing audio.
grazie mille, CAFxX.

 fwrite (sample[0], 2, 1, fp2); //fp2 è il file di output
come sopra
--
Pela

 ha scritto nel messaggio
news:c2_Cb.208946$hV.80...@news2.tin.it...

inoltre il tipo int è solitamente a 32 bit
--
Pela

 ho capito male cosa sia un buffer e lo sto usando in modo sbagliato?
Allorallora, puoi anche usare fread per leggere un solo
campione alla volta se vuoi, ma dovrai chiamare fread() migliaia
di volte e il programma sarà lento... ma lleennttoo....
Seconda cosa: come ti han già detto, un int è un valore a 32 bit,
quindi se chiami fwrite() per scrivere int scrivi campioni a 32 bit
invece che a 16: nessuna meraviglia che la copia sia diversa
dall'originale. O ti viene un file lungo il doppio, oppure la
fwrite tronca brutalmente gli int a 32 bit scrivendone solo la metà
(superiore o inferiore... ma  di sicuro non contiene il numeretto
del campione originale).
Ti consiglio di usare degli short int o delle WORD (che sono a 16 bit) 
invece di int, e di leggerne almeno 512 per volta, in modo da leggere
un multiplo intero di settori di disco alla volta.
Cioè dovresti scrivere:
short int sample_buffer[512]; /* oppure WORD sample_buffer[512] */
...ecc. ecc...
fread(sample_buffer, 2, 512, file_in);
... /* lavoro coi campioni */ ...
fwrite(sample_buffer, 2, 512, file_out);


 bit)
Gli short int sono almeno a 16 bit (come gli int), ma potrebbero
essere molto piu` grandi.
Non esiste nessun tipo "WORD".
        Mauro

 Non esiste nessun tipo "WORD".
Sotto Windows sì.
Se non sei sotto windows:
typedef unsigned short int WORD
Adesso esiste.

Adesso esiste.
E non e' detto che sia 16 bit.
Andrea

 ha scritto nel messaggio
news:l06qtvkok305gie82...@4ax.com...


 in tal caso variabile2 sempre = variabile1 o devo fare qualche typecasting?
No, in tal caso variabile2 è uguale a variabile1 con i due
bit più significativi azzerati. In pratica equivale a:
variabile2 = variabile1 & 0x3FFF

 ha scritto nel messaggio
news:%XqDb.218173$hV.85...@news2.tin.it...


 }
il primo (presunto) errore e' in  2 ^ 15.
Se con 2 ^ 15 pensavi di fare un elevamento a potenza hai
preso un abbaglio: il simbolo ^ in C++ indica lo XOR binario....
il secondo (presunto) errore e' nel calcolo e nei cast che fai.
Anche supponendo che 2 ^ 15 sia sostituito con il valore 32768
o con (1<<15),  tu hai l'espressione
(float) ( sample[0] / 32768)
ora questo dice al compilatore di eseguire la divisione INTERA
sample[0]/32768 e poi convertire il risultato (che sara'
sempre 0) in float. Alla fine quello che calcoli e' 2*sample[0]...
Quello che volevi verosimilmente ottenere era qualcosa di questo tipo.
(short) (sample[0]*(2.0-sample[0]/32768.)
(non entro nel merito del significato di questa funzione, perche'
non ho seguito il thread)
Ultima cosa, mi permetto di sconsigliarti l'uso dei float,
a meno che tu non debba memorizzarne milioni.
I calcoli con i double oltre ad essere molto piu'
precisi sono generalmente altrettanto veloci,
viceversa la bassa precisione dei float in certi
casi puo' far nascere magagne inaspettate e difficili
da scoprire.
ciao,
g.

grazie per la tua risposta, ma quella funzione è l'unica che al momento non
mi interessava (è vero, non l'ho detto): in ogni caso grazie perchè gli
errori che mi hai fatto notare mi torneranno molto utili non appena inzierò
ad usarla...
grazie mille.
"Giovanni Resta" <g.r...@iit.cnr.it.nospam> ha scritto nel messaggio
news:brn1h5$oh7$1...@newsfeed.cineca.it...
