Albero e acquisizione da file

di il
4 risposte

Albero e acquisizione da file

Salve a tutti! Ho ripreso in mano il linguaggio C dopo un po' di tempo e ho una domanda!

Ho questo file in input e non posso sapere a priori quante righe avrà
123456 1,1 2,5
654321 1,5 3,6

Devo immagazzinare questi valori all'interno di un albero. Sono partito dalla classica struttura per gli alberi:
typedef struct nodo_albero_bin
{
	double valore;					/* Valore del nodo - il double è probabilmente sbagliato*/
	struct nodo_alber_bin *sx_p, *dx_p;	/* Puntatori ai nodi */
} nodo_albero_bin_t;
Poi utilizzando questa funzione, ovviamente sbagliata, ho provato a popolare l'albero:
	
/* Dichiarazione delle funzioni */
nodo_albero_bin_t acquisisci_dati(nodo_albero_bin_t *radice_p);	
	
/* Qui ci sarebbe la main ma credo sia irrilevante */	
	
/* Definizione della funzione di acquisizione dati da file */
nodo_albero_bin_t acquisisci_dati(nodo_albero_bin_t *radice_p)

{
	FILE *file_input;				/* File in input */

	int controllo_file;				/* Variabile di controllo del file */

	/* Ciclo do-while che continua fino a che tutti i dati non sono stati acquisiti controllati e inseriti */
	do
	{
		/* Apro il file in lettura */
		file_input = fopen(NOME_FILE,
					"r");
		/* Se si verificano problemi durante l'apertura del file */
		if(!file_input)
		{
			/* Stampo un messaggio di errore */
			printf("Si è verificato un errore durante l'apertura del file.\n");
			
			/* Il ciclo ricomincia */
			controllo_file = 0;
		}
		/* Se non ci sono problemi si procede */
		else
		{
			/* Acquisisco la prima stringa */
			controllo_file = fscanf(file_input,
						"%d",
						&radice_p);

		}
	} while(!controllo_file);
return(*radice_p);
Notare bene che controllo_file funge da variabile di controllo in caso di problema, usata anche per l'apertura del file. Non riscontro problemi ma c'è un warning che non mi piace proprio "warning: format ‘%d’ expects argument of type ‘int *’, but argument 3 has type ‘nodo_albero_bin_t ** {aka struct nodo_albero_bin **}’ [-Wformat=]
"%d","

Detto questo non sono nemmeno sicuro di poter immagazzinare una stringa da file in un interno nodo. Ha senso? Forse dovrei usare un array per ogni singolo nodo? Quale sarebbe il modo ottimale per memorizzare quel tipo di file in un albero? Qualsiasi aiuto è ben accetto! Grazie mille!

4 Risposte

  • Re: Albero e acquisizione da file

    Devo ... albero
    Perché in un allbero? Spiega...
    Prima usa un array per tenerci i dati, poi, eventualmente, crei un albero per farci "qualcosa".
  • Re: Albero e acquisizione da file

    nicolap ha scritto:


    Devo ... albero
    Perché in un allbero? Spiega...
    Prima usa un array per tenerci i dati, poi, eventualmente, crei un albero per farci "qualcosa".

    Perchè è necessario che io usi un albero. Ecco il perchè del devo.

    Non è tanto il cosa, ma è il come.
  • Re: Albero e acquisizione da file

    Allora spiega meglio, in dettaglio cosa devi fare (e perché).
  • Re: Albero e acquisizione da file

    nicolap ha scritto:


    Allora spiega meglio, in dettaglio cosa devi fare (e perché).
    Non sono sicuro di aver capito cos'altro devo spiegare ma faccio un quadro generale della cosa:

    Devo immagazzinare in un albero (non so che tipo, credo il migliore per la situazione) dei dati provenienti da un file di testo come quello che ho detto prima. Poi questi dati verranno utilizzati. Con utilizzati intendo modificati/letti/rimossi, ma non aggiunti. Ma non credo questo sia importante per la domanda originaria.

    Nel dettaglio sinceramente non so cosa aggiungere. Gli elementi sono così pochi che ripeterei solo quello che ho scritto sopra. File di testo per l'input, albero binario e funzione di acquisizione. Funzione che mi permetta di immagazzinare dati da file in un albero binario.

    Ho trovato una funzione che mi permette di acquisire multipli valori da una singola riga di file di testo, solo dovrei adattarla alla mia situazione, cioè modificarla in modo da poterla usare per immettere i dati in una struttura albero binario:
    int main () {
       char str1[10], str2[10], str3[10];
       int year;
       FILE * fp;
    
       fp = fopen ("file.txt", "w+");
       fputs("We are in 2012", fp);
    
       rewind(fp);
       fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);
    
       printf("Read String1 |%s|\n", str1 );
       printf("Read String2 |%s|\n", str2 );
       printf("Read String3 |%s|\n", str3 );
       printf("Read Integer |%d|\n", year );
    
       fclose(fp);
    
       return(0);
    }
Devi accedere o registrarti per scrivere nel forum
4 risposte