Oppure

Loading
10/03/13 11:50
FedFelpato
Ciao a tutti. Ho scritto un codice per copiare un file binario ma mi da un errore. Ecco il codice:

#include <iostream>
#include <fstream>

using namespace std;

int main(){
ifstream ingr;
ofstream usc;
ingr.open("source.txt", ios::in|ios::binary);
usc.open("destination.txt", ios::out|ios::binary);
if((ingr.fail()==true)|(usc.fail()==true)){
     return -1;    
    }
    char app[100];
    int letti = ingr.read(app,128);
    if(ingr.bad()==true) return -1;
    while(ingr.eof()==false){
     usc.write(app,letti);
     if(ingr.bad()==true) return -1;
     letti = ingr.read(app,128);
        if(ingr.bad()==true) return -1;
    }
    usc.write(app,letti);
    if(usc.bad()==true) return -1;
    ingr.close();
    usc.close();
    return 0;
}

L'errore è in questa riga:
int letti = ingr.read(app,128);
g++ -Wall -o "copia file" "copia file.cpp" (nella cartella: /home/paolo/C++/iostream e stringhe)
copia file.cpp: In function ‘int main()’:
copia file.cpp:15:31: error: invalid conversion from ‘void*’ to ‘int’ [-fpermissive]
copia file.cpp:20:31: error: invalid conversion from ‘void*’ to ‘int’ [-fpermissive]
Compilazione fallita.

Sul computer a scuola con windows il codice funzionava. Invece sul mio pc con ubuntu mi dà errore. Potrebbe essere per questo???
Grazie mille.
aaa
10/03/13 12:27
Saik
Beh semplicemente perchè la funzione read non restituisce un int ma un istream& come puoi vedere qui
cplusplus.com/reference/istream/istream/read/
P.S.: su windows non ti restituiva l'errore forse perchè eseguiva un cast implicito :D
aaa
11/03/13 8:47
FedFelpato
Ok grazie per la risposta. Quindi come posso modificare il mio codice e inoltre mi potresti spiegare quali sono i vantaggi di leggere con binary o senza e in particolare quando conviene usare il primo metodo e quando il secondo?
Grazie mille per l'aiuto :)
aaa
11/03/13 10:02
Saik
Allora scrivere in binario può essere utile se si creano file ad accesso diretto ma per i file ad accesso sequenziale è meglio usare l'output formattato ( << ). Per quanto riguarda il codice devi semplicemente eliminare la variabile 'letti' e sostituire il usc.write(app,letti); con usc.write(app,128);
P.S. se la variabile app è composta da 100 caratteri perchè ne vuoi immagazzinare 128?:nono:
aaa