22/04/20 20:33
AldoBaldo
Per caricare in memoria il contenuto di un file di testo in C io di solito faccio così:
char *carica_file_txt( const char *nome_file ) {
char *d = NULL; /* d: dati */
if( *nome_file ) {
FILE *f = fopen( nome_file, "r" );
if( f ) {
size_t i, dim;
int c;
for( dim=0; EOF!=(c=fgetc(f)); ++dim );
if( (d=calloc(dim+1,1)) ) {
for( rewind(f), i=0; EOF!=(c=fgetc(f)); ++i ) d[i] = c;
if( i!=dim ) { free( d ); d = NULL; } /* errore! */
}
fclose( f );
}
}
return d; /* d e' NULL in caso di errore */
}
Il codice non è scritto nel modo più leggibile, perché una delle mie fissazioni è quella di ridurre al minimo la quantità delle righe. Lo so che è un difetto, ma pazienza: io mi ci trovo bene. Una versione più "verbosa" potrebbe essere questa, che fa esattamente la stessa cosa:
/*==============================================================================
Apre in lettura il file di testo nome_file e ne legge carattere per carattere il
contenuto, copiandolo in uno spazio di memoria dinamica appositamente allocato.
Spetta al chiamante liberare la memoria allocata.
Se tutto va a buon fine, restituisce il puntatore alla memoria allocata. In caso
di errore, nessuna memoria risulta allocata e la funzione restituisce NULL.
==============================================================================*/
char *carica_file_txt( const char *nome_file ) {
char *d = NULL; /* d: dati */
if( *nome_file ) {
FILE *f = fopen( nome_file, "r" );
if( NULL != f ) {
size_t i, dim;
int c = fgetc( f );
for( dim=0; EOF!=c; ++dim ) {
c = fgetc( f );
}
d = calloc( dim+1, 1 );
if( NULL != d ) {
rewind( f );
c = fgetc( f );
for( i=0; EOF!=c; ++i ) {
d[i] = c;
c = fgetc( f );
}
if( i != dim ) { /* errore! */
free( d );
d = NULL;
}
}
fclose( f );
}
}
return d; /* d e' NULL in caso di errore */
}
Se dovessi voler usare questa funzione in C++ dovresti scrivere d=(char*)calloc(dim+1,1); anziché d=calloc(dim+1,1);
Ah, dimenticavo: la funzione presuppone che il testo occupi un solo byte per carattere.
EDIT: devi includere stdlib.h e stdio.h .
Ultima modifica effettuata da AldoBaldo 22/04/20 20:37
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.