Domanda

Quando eseguo il mio programma e scelgo di vedere l'elenco dei prodotti, non stampare nulla.Dopo un po 'di tempo, scopro che il valore del fl_size è sempre 0. Perché è questo?

void view_prdct_code_list() {
        FILE *stock = fopen("stock.dat","r+");
        assert(stock);

        int fl_size=ftell(stock);
        int prd_size= sizeof(product);
        int quantity= fl_size/prd_size;
        printf("fl_size=%d",fl_size);

        fseek(stock,0,SEEK_SET);
        prdct cprd= (product *)malloc (sizeof(product)*quantity);
        assert(cprd);

        int i;

        fread(cprd,prd_size,quantity,stock);

        for (i=0;i<quantity;i++){
                printf("PRODUCT CODE: %d\n",cprd->code);
        }

        free(cprd);
        fclose(stock);
}
.

È stato utile?

Soluzione

ftell non restituisce la dimensione totale del file; Restituisce la posizione corrente lettura o scrittura all'interno del file. Si chiama ftell immediatamente dopo aver aperto il file, in modo che la posizione sia l'inizio del file. È possibile utilizzare fseek(stock, 0, SEEK_END) per cercare fino alla fine prima di chiamare ftell, oppure è possibile scaricare un livello e utilizzare fstat(fileno(stock)) per recuperare la dimensione del file direttamente dal sistema operativo.

Ulteriori note:

    .
  1. Nessuna di queste opzioni funzionerà se stai leggendo da un tubo. (In generale, è necessario verificare il successo di ogni singola delle operazioni di accesso ai file.)
  2. fread non è garantito per leggere l'intero file in un sorso anche se lo chiedi di.
  3. Come punti 'ALK', ftell restituisce un long, non un int.
  4. Dovresti aprire questo file apparentemente binario con la modalità "r+b".
  5. file binari senza intestazione di file (e in particolare senza Numero magico , di almeno quattro byte, a zero offset) sono una cosa brutta.
  6. Non lanciare il valore di ritorno del malloc. (È necessario farlo in C ++, ma in c non è solo inutile, può nascondere i bug .)

Altri suggerimenti

Controllare la pagina uomo per ftell, ad esempio questo: http://linux.die.NET / MAN / 3 / FTELL

Ecco la parte rilevante: "La funzione FTELL () ottiene il valore corrente dell'indicatore di posizione del file per il flusso indicato da flusso."

Quando si apre il file, la posizione del cursore sarà all'inizio.Quindi la distanza dall'inizio sarà zero.Quindi ftell restituisce zero.

Per trovare la dimensione del file, consultare questo link: Come posso ottenere le dimensioni di un file in c? .Ecco uno snippet in breve:

fseek(fp, 0L, SEEK_END);
sz = ftell(fp);
.

Assicurarsi di chiamare fseek(fp, 0L, SEEK_SET); dopo sopra.

Because ftell returns the size from the beginning to the current position of the file.

fseek(stock,0,SEEK_SET);

Means you set the position to the first bite of the file.

Also you gotta set fl_size=ftell(stock); after the fseek.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top