Salve, Frank!
Premetto di aver dato solo un'occhiata al codice, tuttavia ho notato un paio di cose che non funzionano.
Anzitutto, la consegna prevede che nella lista vi siano un numero di elementi compreso fra 0 e N. Nella seguente sezione di codice, invece, chiedi
a priori al programma di raccogliere i dati di N persone:
for (int i = 0; i < N; i++) { //E se nel file ci fossero meno di N persone?
flussoDaFile >> persona[i].cognome;
cout << "*debugC: " << persona[i].cognome << endl;
flussoDaFile >> persona[i].nome;
cout << "*debugN: " << persona[i].nome << endl;
flussoDaFile >> persona[i].eta;
cout << "*debugE: " << persona[i].eta << endl;
}
In mia opinione in questo caso conviene gestire in quest'altra maniera l'array:
anzitutto, fra le dichiarazioni aggiungiamo un 'int num = 0;', che sarà il numero di posti dell'array effettivamente occupati.
Dopodichè, potremmo riarrangiare il precedente frammento di codice nel seguente modo:
while (flussoDaFile && num < N) //Il ciclo continuerà finchè non ci saranno errori nell'estrazione o non sarà raggiunta la dimensione massima
{
flussoDaFile >> persona[num].cognome;
flussoDaFile >> persona[num].nome;
flussoDaFile >> persona[num].eta;
/*
I vari output di debug, se servono
*/
if (flussoDaFile) //Se l'input è stato eseguito correttamente, allora incrementiamo il contatore
{
++num;
} //In caso contrario, l'estrazione si concluderà e avremo in num il numero effettivo di elementi.
}
Con questa accortezza, sappiamo che la nostra lista contiene `num' elementi su un massimo di `N', come richiesto dall'esercizio.
(Segue che in tutto il codice si dovrà utilizzare num, non N, come "limite superiore" della capienza dell'array)
A questo punto il secondo errore che ho notato:
...
else {
persona[pos].cognome = nuovaPersona.cognome;
persona[pos].nome = nuovaPersona.nome;
persona[pos].eta = nuovaPersona.eta;
cout << "\n_Acquisizione inserita in lista\n ";
}
Quello che accade in questo punto della funzione non è un'inserzione, ma una sostituzione del pos-esimo elemento con i dati di una nuova persona.
Per implementare l'inserimento della persona, è sufficiente traslare tutto il contenuto dell'array a partire dall'elemento pos-esimo fino alla fine un posto più in là, e poi fare quel che hai scritto:
...
else
{
//Se num < N, allora incrementiamo num
if (num < N) ++num;
//A partire dall'ultimo elemento fino al pos-esimo, spostiamo tutto di un posto verso la fine
for (int i = num; i >= pos; --i)
{
//Se l'array contiene già N elementi, l'ultimo verrà scartato per far posto a quello nuovo
if (i+1 < N) persona[i+1] = persona[i];
}
//Infine, inseriamo nella posizione 'liberata' la nuova persona
persona[pos].cognome = nuovaPersona.cognome;
persona[pos].nome = nuovaPersona.nome;
persona[pos].eta = nuovaPersona.eta;
}
Sperando di non aver fatto a mia volta errori, questo è quanto son riuscito a scorgere di errato nel tuo codice.
Saluti!