Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C] Lettura da un file

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45

    [C] Lettura da un file

    salve a tutti,

    sto scrivendo un programma dove ad un certo punto nasce la necessità di leggere l'intero contenuto di un file di testo e di copiarlo in una stringa.

    Ho pensato a queste soluzioni:

    int file;
    char* buff;

    file=open("/home/user/prova.txt",O_RDONLY );

    while(read(file,buff,1)>0); // 1 byte perchè ho pensato di copiarne uno alla volta,ma nn so se è correto
    oppure:

    FILE* fd;
    char* buff;

    fd=fopen("/home/user/prova.txt","r" );

    while(feof(fd)==0){
    fgets(buff,1,fd);
    }
    sinceramente nn so se sono corrette...
    ah dimenticavo il file di testo contiene un'intera richiesta o risposta http

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: [C] Lettura da un file

    Originariamente inviato da skyboy85
    sinceramente nn so se sono corrette...
    Nessuna delle due è corretta, primo perché non hai allocato alcuna memoria per il buffer ... hai solo un puntatore peraltro non inizializzato, secondo perché la lettura di 1 byte è innanzitutto inefficiente ma sopratutto non andresti "avanti" nel buffer di memoria per come l'hai fatta. E con fgets non leggeresti nulla, ha bisogno di un buffer più ampio perché ci deve stare almeno il nullo finale ed eventualmente, se ci sta, il newline \n.

    Poi la tua prima soluzione utilizza funzioni di I/O non standard che sono specifiche della piattaforma e quindi, se non per casi particolari, da evitare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    la prima soluzione l'ho scritta perchè il codice lo sto realizzando sotto Linux...

    hai ragione mi sono dimenticato di allocare spazio...

    per la seconda correzione nn ho ben capito,se puoi farmi un esempio è meglio...grazie

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da skyboy85
    per la seconda correzione nn ho ben capito,se puoi farmi un esempio è meglio
    Nelle funzioni di lettura hai specificato 'buff'. Quindi scriveresti il byte letto sempre nella stessa locazione. Nella memoria non si "accodano" in automatico i byte letti! Semmai sei tu che devi farlo appositamente, spostando il puntamento nel buffer di memoria per far "depositare" i byte più avanti.

    Comunque se vuoi leggere l'intero contenuto di un file hai sostanzialmente due soluzioni: o determini a priori la dimensione del file, quindi allochi un blocco di memoria di quella dimensione e leggi tutto quanto oppure allochi e in seguito ri-allochi il blocco di memoria man mano che leggi il file.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    o determini a priori la dimensione del file, quindi allochi un blocco di memoria di quella dimensione e leggi tutto quanto
    mi potresti dire come si fa a calcolare a prioiri la dimensione del file???

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da skyboy85
    mi potresti dire come si fa a calcolare a prioiri la dimensione del file???
    Puoi fare un seek al fondo del file e leggere il file position (con le funzioni in stdio.h, si usa fseek/ftell).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    45
    mmmm..se nn ti dispiace potresti scrivermi un codice di esempio???
    grazie mille

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da skyboy85
    mmmm..se nn ti dispiace potresti scrivermi un codice di esempio???
    Per determinare la lunghezza del file con fseek/ftell? Sì è semplice, puoi usare una funzioncina come questa:

    codice:
    long get_file_size (FILE *stream)
    {
        long pos, size;
    
        if ((pos = ftell (stream)) == -1)
            return -1;   /* errore */
    
        if (fseek (stream, 0, SEEK_END) != 0)
            return -1;   /* errore */
    
        if ((size = ftell (stream)) == -1)
            return -1;   /* errore */
    
        if (fseek (stream, pos, SEEK_SET) != 0)
            return -1;   /* errore */
    
        return size;
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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 © 2024 vBulletin Solutions, Inc. All rights reserved.