Newsgroup: it.comp.lang.c++
Titolo: [newbie] stream binari in C++ con un vecchio compilatore

Ciao a tutti,
premetto che a scopo didattico utilizzo un vecchio compilatore Borland
Turbo C++ 3.0 su Win95 (o meglio, su DOS).
Se questo compilatore č ormai tanto obsoleto da non avere niente a che
fare con i moderni, chiudete pure il messaggio e dimenticatemi.
Ho incominciato ad utilizzare la classe IOSTREAM.H , in particolare
per scrivere su file con ifstream e ofstream.
Finché apro file di testo va bene, ma come si fa ad aprire i file in
binario e a leggere in binario?
Tutte le funzioni che ho trovato parlano di char *  o int, mentre nel
vecchio C leggevo il formato binario con un bel void* (non sarą il
modo migliore, ma sono un autodidatta alle prime armi...).
Come devo fare se voglio fare, ad esempio, la copia di un file .exe?
E' gradita anche l'indicazione di qualche sito utile.
Grazie a chiunque per l'aiuto
Robby

 binario e a leggere in binario?
Qualcosa tipo
ifstream tuoFile( "nome", ios::in | ios::binary );
EMG

 modo migliore, ma sono un autodidatta alle prime armi...).
Va benissimo usare
 ifstream::read( char * ptr, streamsize len )
Mi scuso se è una precisione inutile, ma il fatto che si parli di (char *)  
non vuol dire che la funzione sia applicabile soltanto ai file testuali...
Se vuoi copiare un file puoi fare qualcosa del genere...
   ifstream in( "/bin/ls", ios::in|ios::binary );
   ofstream out( "./pippo" );
   in.seekg( 0, ios::end );
   const int len = in.tellg();
   in.seekg( 0, ios::beg );
   char * buf = new char[ len ];
   in.read( buf, len );
   out.write( buf, len );
   delete [] buf;                             
Max

Come devo fare se voglio fare, ad esempio, la copia di un file .exe?
I file,indipendentemente da quale sia il loro formato o la loro
estensione,non sono nient'altro che una serie di byte scritti uno dopo
l'altro.Quindi la procedura per copiare un file resta sempre la stessa
indipendentemente dal tipo di file.
Il Ghenio


Fai benissimo a precisare. Infatti è proprio questo che mi ha mandato
in confusione sul testo che ho letto.
Poi mi rendo conto solo ora che un char alla fine non è altro che un
byte...quindi i conti tornano  :-)
Grazie mille per le delucidazioni...........anche agli altri che mi
hanno risposto.
Saluti
Robby

 indipendentemente dal tipo di file.
Questo, purtroppo, dipende dalla piattaforma.  La tua asserzione
e` vera per Unix di qualunque sapore, e per i sistemi operativi
Microsoft; non e` vera su Macintosh (dove i file possono avere
molteplici "fork"), su VMS (dove l'RMS mantiene miriadi di tipi di
file), per i classici sistemi operativi IBM (per mainframe e mini).
Fra Linux, vari Unix, Windows (e NT), e DOS, siamo sicuramente
ben oltre il 90% dei computer esistenti, ma non per questo si
puo`, a mio parere, pensare di potere ignorare *totalmente* i
Macintosh, eccetera; pensi forse che chi ha un Mac sia un paria?
Inoltre, a seconda della piattaforma, un file puo` avere degli
importanti "attributi", oltre alla "serie di byte uno dopo l'altro"
che compone il file stesso.  In molti casi, per poter dire di "aver
copiato il file" bisogna anche riprodurre correttamente i suoi
vari attributi, non solo i byte che lo compongono; ad esempio,
banalmente, su Unix bisogna normalmente riprodurre anche
vari bit di "permission", altrimenti il file passa da eseguibile a
non eseguibile, o viceversa.
Di conseguenza, la risposta corretta puo` essere solo la solita:
"purtroppo, lo standard C++ non prevede un modo portabile di
copiare file arbitrari, e quindi bisognerebbe discutere di questo
sui gruppi dedicati alle specifiche piattaforme di tuo interesse,
come, ad esempio, it.comp.programmare.win32 per quel che
riguarda le piattaforme Windows a 32 bit come w95, NT, ecc".
Alex