Newsgroup: it.comp.lang.c++
Titolo: Copia di Files Binari

Mi serve fare la copia di un file di testo, che perň, anzi che avere come
fine riga i caratteri ASCII 0Dh e 0Ah (ossia 13 e 10), ha solo 0A.
Ho cosě deciso di aprie i files in binario.
Il mio programma esegue la copia correttamente, ma alla fine del file di
destinazione mi accoda il carattere ASCII 152 ossia : ˙.
Allego il codice nella speranza che qualcuno possa spiegarmi il motivo.
Grazie.
**** CODICE ****
// Definizione degli stream
fsteram fileORG, fileDST;
// Definizione delle stringhe contenenti i nomi dei files
char fnORG[255] = "
file1.org
";
char fnDST[255] = "file2.dst";
// Apertura dei files in binario
fileORG.open (fnORG,ios::in|ios::binary);
fileDST.open (fnDST,ios::out|ios::binary);
// Banale algoritmo di copia (*Possibile posizione dell'errore*)
char ch;
while (!fileORG.eof()){
  fileORG.get(ch);
  fileDST.put(ch);
}
********

 }
Non so bene cosa sia quella funzione-membro "eof" (non mi
pare che sia nello standard...?), ma sospetto che funzioni
come funzionano di solito le funzioni analoghe come feof:
NON significa "ho letto l'ultimo carattere per cui la PROSSIMA
lettura fallira`" bensi` "l'ULTIMA lettura e` fallita".
Quindi eof ti torna vero una volta e la get fallisce, se questa
ipotesi e` corretta.
La stessa get tornera` qualcosa che ti puo` aiutare, ad es.
nello standard, chiamata cosi`, torna lo stesso istream (by
reference) e questo puo` essere testato come se fosse un
booleano (false se ci sono problemi, true se tutto OK);
quindi cambiando il corpo del ciclo a
    if(fileORG.get(ch)) fileDST.put(ch);
tutto andrebbe; forse meglio ancora cambiare tutto il
ciclo a
    while(fileORG.get(ch)) fileDST.put(ch);
Alex

 }
Forse dovresti prima leggere il carattere e poi fare il test per vedere
se è finito il file:
char ch;
while (true){
  fileORG.get(ch);
  if (!fileORG.eof()) break;
  fileDST.put(ch);
}
EMG

lettura fallira`" bensi` "l'ULTIMA lettura e` fallita".
Se non mi sbaglio 'eof' fallisce miseramente quando si ha a che fare
con dei file binari, e funziona correttamente solo con i file
sequenziali. In più, come hai appunto specificato tu, non é standard.
Ed inoltre non capisco proprio perché ci si debba ostinare a tutti i
costi nel fare la copia di un file byte per byte, un approccio che
rallenta pesantemente l'esecuzione del programma soprattutto se si ha
a che fare con dei files di grosse dimensioni.
Non sarebbe meglio copiare un file binario in questo modo?
ifstream fileORG( nome,ios::binary | ios::ate);
ofstream fileDST( nome, ios::binary | ios::trunc);
int dim= fileORG.tellg();   //ricava le dimensioni le file.
char *buf= new char[dim];
fileORG.seekg(0);
fileORG.read(buf,dim);
fileDST.write(buf,dim);
Il Ghenio
-----
Noi Europa siamo ovunque ci sia un branco
capace di provare amore per la natura,
di arrossire di vergogna per l'egoismo e i compromessi,
di sentire orrore per la volgarità il disordine e le schiavitù.
Veri partigiani europei sono tutti quelli che non hanno mai accettato
nulla del nuovo costume borghese e al di là delle differenze
ideologiche un giorno staranno tutti dalla stessa parte.
Contro di voi,per la libertà.
(Artamano 4/1/2000)
-----

 destinazione mi accoda il carattere ASCII 152 ossia : ˙.
 Non č che ho seguito tanto il resto del thread, xchč non programmo molto in
c++, ma se ti puň essere d' aiuto controlla meglio il carattere che hai
riportanto, che secondo il mio ansi ascii č 255. Ciao