PDA

Visualizza la versione completa : [c] leggere e scrivere file binari


j4ck_andros
03-01-2008, 01:05
ciao
devo leggere un file binario e trasferirlo sulla scoket e poi nel client devo ricevere i dati e scriverlo.
il mio problema leggere e scrivere un file binario.
ho provato a cercare in giro e ho trovato le funzioni fread e fwrite,ma una volta finito il trasferimento il file copiato non veniva visualizzato.

Mr.Bloom
03-01-2008, 18:41
Le chiamate sono quelle: fread e fwrite.

Il problema deve essere un naltro, prima di tutto:
controlli il valore di ritorno delle funzioni? anche di fopen ?
Di solito sono problemi di permessi.

j4ck_andros
03-01-2008, 23:42
no,non controllo il valore di ritorno delle funzioni e ne anche della fopen.
le funzioni fread e fwrite che cosa tornano?

Mr.Bloom
04-01-2008, 14:20
Originariamente inviato da j4ck_andros
no,non controllo il valore di ritorno delle funzioni e ne anche della fopen.

male...molto male : bisgona sempre controllare il valore di ritorno, una prassi di buona programmazione.

per sapere il valore di ritorno delle funzioni cerca man <funzione> su google.
ottieni pagine come questa (http://www.rt.com/man/fread.3.html).

come puoi vedere in basso sono elencati i RETURN VALUES in caso di successo e di errore della chiamata.

j4ck_andros
05-01-2008, 01:00
ho ancora qualche problema ma non riesco ancora a capire che errore faccio.


#include <stdio.h>
int main()
{

FILE *fp;
FILE *fp2;
char buff[10];
fp=fopen("c:\\documents and settings\\administrator\\Desktop\\ko.exe","rb");
if(fp==NULL)
{
printf("errore nel aprire il file in lettura\n");
return 0;
}
fp2=fopen("c:\\documents and settings\\administrator\\Desktop\\ko2.exe","wb");
if(fp==NULL)
{
printf("errore nella creazione del file\n");
return 0;
}
while(!feof(fp))
{
int i=fread(buff,10,1,fp);
if(i==0)
{
printf("errore\n");
return 0;
}
int j=fwrite(buff,10,1,fp2);
if(j==0)
{
printf("errore\n");
return 0;
}
}
printf("finito\n");
return 0;
}

che cosa sbaglio?

j4ck_andros
05-01-2008, 01:07
.

j4ck_andros
05-01-2008, 01:18
scusami per il post inutile di sopra ma non riesco ne anche a cancellarlo...

j4ck_andros
05-01-2008, 03:19
ho provato anche a fare cosi:
Client


if(fp==NULL)
{
printf("errore nella creazione del file\n");
return;
}
while(1)
{
byte_recv=recv(conn,dati_file,512,0);
if(strcmp(dati_file,"finito")==0)
break;
fwrite(dati_file,1,512,fp);
dati_file[byte_recv]=0;
dati_file[0]=0;
i++;
printf("la %d parte mandata con successo\n",i);
}
fclose(fp);
printf("copia terminata con successo\n");

Server


while(leggi=fread(dati_file,1,512,fp))
{

send(sock,dati_file,512,0);
dati_file[0]=0;

i++;
printf("la parte %d e' stata inviata correttemente\n",i);
}
fclose(fp);
sleep(1000);
send(sock,finito,sizeof(finito),0);

ma una volta terminato il trasferimento mi dice che il file danneggiato....non so piu che cosa fare.... :cry: :cry: :cry:

Mr.Bloom
05-01-2008, 12:19
Allora nel primo file sbagli il controllo.
La fread e la fwrite tornano 0 sia n caso di errore che in caso di end of file.
Per cui il tuo programma ti da sempre errore perch quando arrivi alla fine di fatti i vale 0 percui
entra nel ramo if della gestone dell'errore.
per distinguere errore da eof devi usare ferror e feof, quindi devi mettere

if (ferror(fp)) dentro al ramo if di getsone dell'errore.
leggiti bene la man che ti ho postato prima dove parla anche di feof e ferror, perch la variabile dove c' scritto
se un errore o un eof va ripulita tra una chamata e l'altra.

Lo so , un po confuso il tutto. ma di solito la gestione dei valori di ritorno piu facile da gestire,
la libreria standard con i files rappresenta un eccezione.

ora guardo il secondo codice.....

Mr.Bloom
05-01-2008, 12:50
2 codice client, allora:

per uscire dal ciclo usi questa cosa qua:


if(strcmp(dati_file,"finito")==0)
break;



che, a mio modesto parere, non se p vede! :D

infatti terminera solo nell'evento fortuito in cui il file che ti sta spedendo abba dimensione
k * 512 + 6. dato che 6 la lunghezza della stringa 'finito'. E non detto che anche cosi ti funzioni
perche dipende sempre dal TCP quanti dati riesce a portarti nel buffer di lettura della recv.
tu cotrolli se nel buffer dati_file c' ESATTAMENTE la stringa "finito" ma tu nel buffer leggi 512 byte
percui supponiamo che il server ti invii questa cossa qua : abcdefghifinito
tu la leggi tutta alla prima botta (perche leggi 512) e la strcmp non uguale a 0, alla secnoda
ormai "finito" te lo sei gia bello che tirato su dal TCP e non lo leggerai pi.
Questo non un problema banale, ma comune.
ad esempio in telnet dove la stringa di fine comando /r/n, ti consiglio di spulciarti il codice di lettura dei
comandi di qualche server tenet o ftp open source.

anche il fatto che usi la fwrite con 512 sbagliato, devi scrivere tanti caratteri quanti sono quelli letti dalla recv, ovvero byte_recv
insomma..mi sembra che ci sia bisogno di ripassare la
teoria (http://www.lilik.it/~mirko/gapil/gapilch16.html#x567-27300014)
:)

Loading