Dimensione file in C

di il
10 risposte

Dimensione file in C

Buongiorno a tutti sto creando un programma per la gestione di una libreria, essenzialmente il programma è un archivio dove si possono inserire libri, salvarli su file e poi successivamente poterli ricercare ecc, ho creato una funzione per il conteggio e la dimensione dello spazio che occupa il file in totale ma non capisco il perchè ogni blocco mi occupa 156 byte.

questa è la struttura della libreria:

typedef struct{
char titolo[MAX];
char autore[MAX];
char genere[MAX];
int anno;
}libreria;

/*Funzione inserimento libro*/
void ins_libro(void)
{
    system("cls");
    libreria libro;
    fptr = fopen("archivio.dat","ab+");
    if(fptr == NULL)
   {
      printf("Errore apertura File!");
      exit(1);
   }
    printf("Inserisci il titolo del libro: ");
    gets(libro.titolo);
    fflush(stdin);
    printf("Inserisci l'autore del libro: ");
    gets(libro.autore);
    fflush(stdin);
    printf("Inserisci il genere del libro: ");
    gets(libro.genere);
    fflush(stdin);
    printf("Inserisci anno di scrittura: ");
    scanf("%d",&libro.anno);
    fflush(stdin);
    fwrite(&libro, sizeof(libreria), 1, fptr);
    fclose(fptr);
}
Mentre questa è la funzione per il conteggio dei byte:

long int findSize(char file_name[])
{
    
    FILE* fp = fopen(file_name, "rb");
    if (fp == NULL) {
        printf("File Not Found!\n");
        exit (1);
    }

    fseek(fp, 0L, SEEK_END);

    long int tot = ftell(fp);

    fclose(fp);

    return tot;
}
per ogni libro che inserisco vengono aggiunti 156 byte, il totale di questi byte come vengono calcolati?
ossia ogni carattere è 1 byte e si sommano anche gli spazi? oppure il programma aggiunge qualcos'altro?

10 Risposte

  • Re: Dimensione file in C

    E quanto vale MAX ??
  • Re: Dimensione file in C

    Non hai messo quanto vale MAX

    La dimensione della tua struttura (cioè quanti byte scrivi) dovrebbe essere MAX*3+4, ma non è detto, dipende dal compilatore. Se vuoi una dimensione della struttura prevedibile, ad esempio in GCC devi aggiungere __attribute__((__packed__)) , con altri compilatori devi usare l'attributo equivalente.

    La funzione gets() è stata rimossa dagli ultimi standard del C. Usa fgets()

    fflush(stdin) ha un comportamento indefinito e va evitato proprio.
  • Re: Dimensione file in C

    Se MAX (come credo) è 50 e l'allineamento delle strutture usato è a 4 byte, allora hai bisogno di 156 byte (154 non è divisibile per 4). Due byte saranno aggiunti dopo la terza stringa.

    Con Visual C puoi usare

    #pragma pack(2)

    oppure

    #pragma pack(1)
  • Re: Dimensione file in C

    Si MAX è 50, conoscevo del fatto dell'uso di fgets() al posto di gets() mami sfugge il motivodi fflush() come mai ha comportamenti indefiniti?
  • Re: Dimensione file in C

    Perchè il mondo è cambiato un bel po', tra quando "pensi" di scrivere qualcosa e quando davvero ciò accade
  • Re: Dimensione file in C

    E' scritto nello standard che fflush(stdin) è undefined. Alcuni compilatori lo accettano per fare operazioni custom, ma concettualmente non ha senso flushare e processare i byte accumulati in uno stream in ingresso (non ce l'hai tu il controllo)
  • Re: Dimensione file in C

    +m2+ ha scritto:


    Perchè il mondo è cambiato un bel po', tra quando "pensi" di scrivere qualcosa e quando davvero ciò accade
    ma che c'entra con il mio post ?!
  • Re: Dimensione file in C

    È la risposta alla tua domanda.
    fflush fa, faceva, qualcosa di 'sensato' una trentina di anni fa.
    Con un sistema operativo moderno, dove ci sono 'mille' layer di caching e buffering tra programma e dato, il flushing è ormai inefficace.
    Per inciso nulla ti vieta di trovare il sorgente di fflush e studiarlo (oggi è facile).
    è sempre interessante vedere cosa succede 'dietro le quinte'
  • Re: Dimensione file in C

    Grazie!!!
  • Re: Dimensione file in C

    Te ne metto uno al volo, dove vedi cosa fa.
    Niente, in pratica
    
    /*	$OpenBSD: fflush.c,v 1.5 2005/08/08 08:05:36 espie Exp $ */
    /*-
     * Copyright (c) 1990, 1993
     *	The Regents of the University of California.  All rights reserved.
     *
     * This code is derived from software contributed to Berkeley by
     * Chris Torek.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     * 1. Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     * 2. Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     * 3. Neither the name of the University nor the names of its contributors
     *    may be used to endorse or promote products derived from this software
     *    without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     * SUCH DAMAGE.
     */
    #include <errno.h>
    #include <stdio.h>
    #include "local.h"
    /* Flush a single file, or (if fp is NULL) all files.  */
    int
    fflush(FILE *fp)
    {
    	if (fp == NULL)
    		return (_fwalk(__sflush));
    	if ((fp->_flags & (__SWR | __SRW)) == 0) {
    		errno = EBADF;
    		return (EOF);
    	}
    	return (__sflush(fp));
    }
    int
    __sflush(FILE *fp)
    {
    	unsigned char *p;
    	int n, t;
    	t = fp->_flags;
    	if ((t & __SWR) == 0)
    		return (0);
    	if ((p = fp->_bf._base) == NULL)
    		return (0);
    	n = fp->_p - p;		/* write this much */
    	/*
    	 * Set these immediately to avoid problems with longjmp and to allow
    	 * exchange buffering (via setvbuf) in user write function.
    	 */
    	fp->_p = p;
    	fp->_w = t & (__SLBF|__SNBF) ? 0 : fp->_bf._size;
    	for (; n > 0; n -= t, p += t) {
    		t = (*fp->_write)(fp->_cookie, (char *)p, n);
    		if (t <= 0) {
    			fp->_flags |= __SERR;
    			return (EOF);
    		}
    	}
    	return (0);
    }
Devi accedere o registrarti per scrivere nel forum
10 risposte