[C++] Strutture

Landau1
Ciao a tutti, ho questo esercizio:

Il file codici.dat contiene un numero non precisato di numeri interi. Ciascun numero intero rappresenta un codice. Il file circoli.dat, nella stessa cartella, contiene invece un numero imprecisato di circoli in R2 . Ciascun circolo è caratterizzato da una quadrupla (x,y,r,c) dove x e y (di tipo float) sono le coordinate del centro del circolo (rispetto ad un sistema di riferimento assegnato), r (float) il raggio del circolo e c (int) è il codice che descrive la “specie” del circolo.

Scrivere un programma che svolga le seguenti operazioni:
1) Contare e caricare in un vettore (di interi) i codici presenti sul file codici.dat. Stampare a video il risultato.
2) Contare e caricare in un vettore i circoli descritti nel file circoli.dat. Stampare a video il risultato.
3) Eliminare tutti i circoli il cui codice non appartenga all’insieme dei codici caricati al punto 1 e stampare a
video il numero di circoli eliminati e il numero di circoli rimasti.

(to be continued)


Questo è quello che ho scritto fino ad adesso: per il punto 1,

ifstream file_in;
	file_in.open("codici.dat",ios::in);

	if(file_in.fail()){ 
        	cout << endl << "Problema apertura file di ingresso dati! Esco!";
        	return -1;
    	}

	int appo, conta;
	while (!file_in.eof()){ 
		conta++;
        	file_in >> appo;
	}
	
	int* codici=new int[conta];
	file_in.close(); 
    	file_in.open("codici.dat",ios::in);

	for(int i=0; i<conta; i++)
        	file_in >> codici[i];

	file_in.close();

	cout << "Il numero dei codici è: " << conta << endl;
	for (int i=0; i<conta; i++)
		cout << "L'" << i << "-esimo codice è" << codici[i] << endl;


Per il punto due, pensavo di creare una struttura e una funzione fatte così:

struct circolo{          
	
	float x;  
	float y;
	double r;
	int cod;
}; 


void caricaStructCircolo(string nome, circolo *c){

	ifstream file_in;
	file_in.open(nome); 
	
	if(file_in.fail()){
		cout << "Errore, esco" << endl;
		return -1;
	}

	file_in >> c->x;
	file_in >> c->y;
	file_in >> c->r;
	file_in >> c->c;

	return;

}


Solo che adesso non so come fare a caricare tutto in un unico vettore...

Risposte
Landau1
La mia domanda principale è sul funzionamento di file_in: cioè se quando chiamo la funzione una seconda volta, viene considerato nuovamente il file da capo oppure se si riprende a scrivere dall'ultimo dato memorizzato. Se funziona in quest'ultimo modo allora dovrei poter cavarmela in qualche modo...

vict85
Riparte da zero ma leggere da file è una operazione piuttosto lenta, quindi si preferisce non aprire lo stesso file due volte, uno per contare e la seconda per leggere. Dovresti riallocare la memoria man mano che la dimensione dell'array diventa troppo piccola (per esempio puoi aumentare la memoria in modo lineare, quadratico, usando la successione di Fibonacci o altri metodi simili).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.