Newsgroup: it.comp.lang.pascal
Titolo: Curiosità file binari

é possibile scrivere, leggere o modificare file in formato binario?
Esiste qualche comando per farlo?
--
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
e-mail: 
cerch...@ciaoweb.it
cell.: 338/1347116
l'elenco telefonico dei telefonini:
http://www.elencoonline.it/
Bye byte, Cerchietto
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

Esiste qualche comando per farlo?
BlockRead/BlockWrite
sono funzioni del Turbo Pascal.
--
Walkie...@Libero.It (ICQ# 8143647)

 BlockRead/BlockWrite
Grazie!!! :-))
ma....
nell'help ho trovato un esempio per copiare un file, binario, in un
altro. E' possibile fare qualcosaltro con i file binari oltre a copiarli?
Ad es., creare un file binario e poi salvarci numeri, caratteri, stringhe
o qualcosa che non sia copiare paro paro un altro file in un altro?
(spero di si).
Ciao ciao,
Simone.


 Dichiari F: FILE OF (Struttura);
Dunque, se dichiaro F : TEXT mi crea un file ascii e se invece
dichiaro F : FILE OF... (ad es., f : file of string) mi crea un file
binario? Cosa sono allora questi file binari? un file .exe o .com
o .jpg č binario?
--
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
e-mail: 
cerch...@ciaoweb.it
cell.: 338/1347116
l'elenco telefonico dei telefonini:
http://www.elencoonline.it/
Bye byte, Cerchietto
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

o .jpg č binario?
Potresti anche dichiarare con TYPE una nuova struttura (un record con
sottocampi misti, ovviamente) e dichiarare il file come
F: FILE OF TUASTRUTTURA;
Cosě facendo leggerai i dati del file decodificandoli secondo la logia della
tua struttura dati.
I file JPG o EXE o COM sono sě binari, ma non contengono la stessa struttura
lungo tutto il file... anzi gli EXE non sono proprio cose simili. Gli EXE
vanno letti secondo un criterio di decodifica byte per byte... cioč a
seconda del byte che leggi... si capisce se il byte successivo fa parte
della stessa informazione o meno.
Diversi sono invece file come i BMP... che all'inizio possiedono
un'intestazione (quanto č larga e alta l'immagine... quanti e quali colori
ci sono) e poi lungo tutto il file la struttura dati resta inalterata.
I JPG potrebbero essere come i file BMP, se non fosse che possiedono una
compressione e quindi finiscono per essere un po' come i file EXE.
Cmq se vuoi decodificare uno specifico tipo di file... dichiara il file come
FILE OF BYTE o FILE OF CHAR in modo da poter leggere byte per byte oppure
dichiaralo semplicemente come FILE usando BLOCKREAD e BLOCKWRITE.
Esistono diversi siti che forniscono documentazione sul formato di alcuni
file (BMP, MP3, EXE, JPG, GIF, WAV, ecc...)
L'url del sito che uso e che stimo moltissimo č:
http://www.wotsit.org
Saluti dal grande VEGETA PRINCIPE DEI SAIYAN
     /\   /\
\_/   \/   \_/


Tutti i file sono binari, i file di testo non esistono :-)
E' modo in cui ci accedi che cambia.
Quando apri un file come 'text', il pascal fa delle operazioni
in automatico, come considerare le righe, i gruppi di caratteri,
i separatori e gli spazi bianchi, etc...
mmmh qualcosa di pratico....  un file fatto cosi':
ciao come va
3 4 5
x
se lo apri in modo testo puoi leggere
read (f,s); {con f: text e s: string }
read (f,m); {con m : integer }
read (f,n); {con n : integer }
read (f,o); {con o : integer }
read (f,c); {con c : char }
il programma riempira' le variabili convertendo automaticamente nei tipi
giusti, avrai:
s = 'ciao come va'
m = 3
n = 4
o = 5
c = 'x'
se ripetessi una 2a volta l'ultima riga otterresti il caratte di fine file
 (#26 che viene visualizzato come una freccettina a destra)
se vuoi puoi anche leggere anche il 3 come carattere invece che come numero
dichiarando la variabile m di tipo char.
Riassuntone I :
in modo testo il contenuto del file viene 'interpretato' e letto in sequenza
    ( e infatti e' un modo di accesso sequenziale )
Quando apri un 'file' invece, i dati letti non vengono interpretati, ma ti
vengono dati pari pari a come vengono letti, quindi in un .txt ti becchi
tutti gli spazi, tutti i tab, tutti i fine riga (#13#10 sotto win, solo #13
per sistemi *nix). NON il carattere di fine file, che e' una convenzione
per il modo testo (non esiste nel file !! ). Quando il file e' finito, o
controlli (funzione eof( ) ) oppure ti becchi un bel disk read error con
conseguente fine del prog :-).
un 'file' non tipato, cioe' dichiarato solo f : file; senza of qualchecosa,
viene letto a 'blocchi'. La dimensione del blocco la definisci quando lo
apri con Reset(f, [dimensione_blocco] );
se ometti dimensione_blocco viene considerato 128byte (non mi chiedere
perche'...) poi con blockread/write puoi leggere/scrivere n blocchi dal
file.
in questo modo puoi leggere sia singoli byte che strutture complesse dai
file, senza doverti sbattere con assurdi programmi che leggono carattere
per carattere etc...
per leggere una qualsiasi struttura/record da un file ti basta sapere
a) com'e' fatta (e quindi quanto e' grossa)
b) dov'e' nel file
con la funzione seek (f,pos) 'salti' nel file al 'blocco' pos (se usi
reset(f,1) al pos-esimo byte) ( occhio il 1° blocco e' lo 0, l'ultimo e'
filesi ze(f) - 1 ), poi ti prepari la tua bella variabile del tipo giusto
(il record che vuoi leggere) e con blockread (f,v,1) ti tiri in
memoria (cioe' in v) il tuo blocco di file. se poi vuoi leggere il
blocco dopo (
s.se
 sei sicuro che sia uguale) basta che ripeti
l'operazione. Se vuoi leggere n blocchi _uguali_ ti prepari la tua
x : array [1..n] of struttura; e usi blockread ( f, x, n );
Occhio, una delle cose piu' facili (da sbagliare, sbagliare e' sempre
facile :-) ) e' leggere una cosa e metterla nella
struttura/tipo/variabile sbagliata.
Riassuntone II :
in modo binario i files li leggi come e dove vuoi  tu
    (  si chiamano anche file ad accesso casuale [ non random :-) ]  )
da qualche parte su internet c'era la File Format Enciclopedia con le
strutture gia' belle pronte (in pascal ? mi sembra di si... o forse era C...
boh... ) di un bulacco di tipi di file.
In questi casi di ricerca disperata 
www.metacrawler.com
 a volte funzia
egregiamente
ciao
P.S.  se c'e' ancora qlcs che non ti gira, e che l'help del tp non ti
sfagiola, magari te lo spedisco per posta che non vorrei intasare
l'ng con soli miei _enormi_ messaggi :-))
(sempre che non interessi ad altra gente ;-) )
--
Dreadnaut (dn)
drea...@liberoDALLASPAM.it
(Life would be easier if I had the source code)

per sistemi *nix).
#10, non #13.
--
Walkie...@Libero.It (ICQ# 8143647)

 l'ng con soli miei _enormi_ messaggi :-))
Sissi, ci sto ;)
Grazie ancora,
Simone.


 E' modo in cui ci accedi che cambia.
Vediamo un po' se ho capito...
Se apro un nuovo file binario, ci scrivo ad es., con Blockwrite
una variabile di tipo byte contenente il valore 65, lo chiudo
e poi lo riapro come file di testo e leggo la variabile... ne
dovrebbe uscire la lettera "A"? (il cod. ascii 65 = A)
E' cosě? o sbaglio?


--
Bravissimo!!!!!!! Hai capito tutto... vinci una bargògia urticante!!!!!!
-----------------------------------------------------------------------
Saluti dal grande VEGETA PRINCIPE DEI SAIYAN
    /\   /\
\_/  V   \_/

 Bravissimo!!!!!!! Hai capito tutto... vinci una bargògia urticante!!!!!!
No, non funziona!
Guarda cos'ho provato a scrivere...
==========
var
   numero:byte;
   f : file;
begin
     assign (f, 'c:\simone\pascal\binario.txt');
     numero:=64;
     rewrite (f);
     blockwrite(f,numero,0);
     close (f);
     write('finito'); readln;
end.
==========
è giusto Blockwrief(file, variabile, posizione_byte)?
In posizione_byte ho messo il valore 0, è questo il
primo valore in un file? o è 1?
Ho provato poi a cambiarlo con 1 ed oltre alla "A"
mi compaiono anche tante altre cose tra cui il percorso
del file... che c'entra? e la dimensione del file invece
di essere di 1 byte è 128! E' normale?
Dreadnaut aveva scritto
==========
un 'file' non tipato, cioe' dichiarato solo f : file; senza of qualchecosa,
viene letto a 'blocchi'. La dimensione del blocco la definisci quando lo
apri con Reset(f, [dimensione_blocco] );
se ometti dimensione_blocco viene considerato 128byte (non mi chiedere
perche'...) poi con blockread/write puoi leggere/scrivere n blocchi dal
file.
==========
Allora ho provato a fare la stessa cosa per la scrittura digitando
Rewrite(f, [dimensione_blocco]); dove dimensione_blocco è 1,
ma mi ha dato un messaggio di errore.
Che faccio?


 ma mi ha dato un messaggio di errore.
( le quadre non le hai messe vero in rewrite ?? :-) )
( asp per sicurezza specifico: io uso le quadre per indicare
qualcosa di opzionale che puoi mettere o ne, oppure per gli array )
cmq cosi' dovrebbe funzionare
numero := 64;
rewrite ( f , 1 );
blockwrite ( f , numero , 1 );
mmmh cmq 64 non e' proprio la 'A' ma il simbolo '@' :-)
i caratteri maiuscoli iniziano da 65 ( che e' proprio 'A' )
ciauz


> >E' cosě? o sbaglio?
La sintassi di BlockWrite č:
    BLOCKWRITE(FILE, Blocco_di_dati, NBytes, BYTESSCRITTI);
In pratica FILE č la variabile di tipo FILE a cui associ il documento in cui
vuoi scrivere;
Blocco_di_dati č la variabile, il vettore, il record... quello che vuoi...
in pratica l'informazione che vuoi buttare su file...
NBytes č il numero di bytes che vuoi scrivere (AVVISI il pascal che i bytes
da scrivere sono NBytes)....
BYTESSCRITTI č un valore di ritorno che ti dice quanti bytes realmente sono
stati scritti sul file.
Var A: Byte;
        Scritti: Word;
        F: File;
Begin
        Assign(F, 'C:\Prova.txt');
        Rewrite(F,1);
        A:=65;
        BlockWrite(F,A,SizeOf(A),Scritti);
        Close(F);
        Writeln(Scritti,' bytes scritti sul file.');
End.
Prova e vedi se va... penso di si =)
