Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [c] leggere e scrivere file binari

    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.

  2. #2
    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.

  3. #3
    no,non controllo il valore di ritorno delle funzioni e ne anche della fopen.
    le funzioni fread e fwrite che cosa tornano?

  4. #4
    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.

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

  5. #5
    ho ancora qualche problema ma non riesco ancora a capire che errore faccio.
    codice:
    #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?

  6. #6
    .

  7. #7
    scusami per il post inutile di sopra ma non riesco ne anche a cancellarlo...

  8. #8
    ho provato anche a fare cosi:
    Client
    codice:
     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
    codice:
    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....

  9. #9
    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
    Codice PHP:
    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.....

  10. #10
    2° codice client, allora:

    per uscire dal ciclo usi questa cosa qua:
    Codice PHP:
    if(strcmp(dati_file,"finito")==0)
                    break; 
    che, a mio modesto parere, non se pò vede!

    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.