Perché Ftell restituisce 0 in questa funzione?
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);
}
. 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:
- .
- 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.)
-
fread
non è garantito per leggere l'intero file in un sorso anche se lo chiedi di. - Come punti 'ALK',
ftell
restituisce unlong
, non unint
. - Dovresti aprire questo file apparentemente binario con la modalità
"r+b"
. - file binari senza intestazione di file (e in particolare senza Numero magico , di almeno quattro byte, a zero offset) sono una cosa brutta.
- 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
.