Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [C] Dimensione file

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    75

    [C] Dimensione file

    Salve, esiste una funziona che calcola la dimensione in byte di un file.
    Devo utilizzare la system call int read(int descriptor, char *buffer, int size) per per lavorare su un file.
    Il problema è che, a priori, non so quanto vale size,ovvero la quantità di bytes da leggere, ed io devo poter leggere l'intero file. Come si fa in questi casi ? Grazie

  2. #2
    Utente di HTML.it L'avatar di Metflar
    Registrato dal
    Apr 2007
    Messaggi
    790

    Re: [C] Dimensione file

    Originariamente inviato da dexter86
    Salve, esiste una funziona che calcola la dimensione in byte di un file.
    Devo utilizzare la system call int read(int descriptor, char *buffer, int size) per per lavorare su un file.
    Il problema è che, a priori, non so quanto vale size,ovvero la quantità di bytes da leggere, ed io devo poter leggere l'intero file. Come si fa in questi casi ? Grazie
    prova così:
    codice:
    int size;
    fseek(f, 0, SEEK_END);
    size = ftell(f);
    fseek(f, 0, SEEK_SET);
    dove f è il puntatore al file
    conoscenze: C/C++, Java, PHP, Python
    [No PM tecnici o di qualsiasi genere]

  3. #3
    usando i descrittori di file non mi viene in mente niente di immediato.

    Comunque puoi semplicemente inserire nel parametro size il numero massimo di byte che un tuo file può contenere, la funzione read avrà le stesse performance, leggerà tutto il contenuto del file e ti ritornerà il numero effettivo di byte letti.
    Oppure usi funzioni di livello più alto che usano i puntatori a file.
    ciao
    sergio

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    75
    grazie ! Ho risolto. Ho usato la lseek spostando il file pointer per tutta la lunghezza del file, ad ogni spostamento ho incrementato un contatore. Il valore di tale contatore mi da proprio la dimensione in bytes del file.

  5. #5
    Utente di HTML.it L'avatar di Metflar
    Registrato dal
    Apr 2007
    Messaggi
    790
    Originariamente inviato da dexter86
    grazie ! Ho risolto. Ho usato la lseek spostando il file pointer per tutta la lunghezza del file, ad ogni spostamento ho incrementato un contatore. Il valore di tale contatore mi da proprio la dimensione in bytes del file.
    facevi prima con il mio metodo
    conoscenze: C/C++, Java, PHP, Python
    [No PM tecnici o di qualsiasi genere]

  6. #6
    Originariamente inviato da dexter86
    grazie ! Ho risolto. Ho usato la lseek spostando il file pointer per tutta la lunghezza del file, ad ogni spostamento ho incrementato un contatore. Il valore di tale contatore mi da proprio la dimensione in bytes del file.
    sì, va bene la lseek, ma usala così

    unsigned long dim_file = lseek( fd, 0L, SEEK_END );

    e quindi riposizioni all'inizio per la lettura

    lseek ( fd, 0L, SEEK_START );

    @Metflar
    la tua versione usa file pointer mentre dexter86 vuole utilizzare file descriptor, chiamando direttamente le funzioni di sistema.

    ciao
    sergio

  7. #7
    Utente di HTML.it L'avatar di Metflar
    Registrato dal
    Apr 2007
    Messaggi
    790
    Originariamente inviato da mondobimbi
    sì, va bene la lseek, ma usala così

    unsigned long dim_file = lseek( fd, 0L, SEEK_END );

    e quindi riposizioni all'inizio per la lettura

    lseek ( fd, 0L, SEEK_START );

    @Metflar
    la tua versione usa file pointer mentre dexter86 vuole utilizzare file descriptor, chiamando direttamente le funzioni di sistema.

    ciao
    sergio
    lol non avevo letto
    conoscenze: C/C++, Java, PHP, Python
    [No PM tecnici o di qualsiasi genere]

  8. #8
    non ti avilire, non sono così convinto che volesse realmente utilizzare le chiamate di sistema, in linea di principio è meglio utilizzare le funzioni di più alto livello come i file pointer che, come minimo, sono bufferizzate.

    ciao
    sergio

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    75
    grazie a tutti per i consigli. Veramente sto studiano il C da molto poco , e la soluzione con la system call lseek è la prima cosa che mi è venuta in mente e che funzioni, ma non volevo necessariamente usare system calls.

  10. #10
    usa fopen, fclose, fread, fwrite per aprire, chiude, leggere e scrive in in file

    codice:
    /* nel tuo caso per leggere tutto un file  */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main () {
    
      FILE * pFile;
      long lSize;
      char * buffer;
      size_t result;
    
      pFile = fopen ( "mio_file" , "rb" );
      if (pFile==NULL) {
        fputs ("Ho un errore nella apertura del file", stderr); exit (1);
      }
    
      // calcolo la lunghezza del file
      fseek (pFile , 0 , SEEK_END);
      lSize = ftell (pFile);
    
      // torniamo a bomba
      rewind (pFile);
    
      // alloco la memoria per contenere l'intero file
    
      buffer = (char*) malloc ( sizeof ( char ) * lSize );
    
      // copio il file nel buffer
    
      result = fread  ( buffer, 1, lSize, pFile );
    
      if (result != lSize) {
        fputs ( "Errore di letture file", stderr );
        exit (3);
      }
    
      //  ok fatto !! chiudiamo il file
      // è sempre meglio perchè i file descriptor sono una risorsa limitata
      fclose (pFile);
    
      // adesso il file è in memoria e ne faccio quello che voglio
      // ma devo ricordarmi alla fine di rilasciare la memoria
    
      free (buffer);
    
      return (0) ;
    
    }

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.