в этой программе читается файл, в котором содержится много студентов. В каждой строке есть фамилия, имя, отметка и возраст учащегося, которому принадлежат данные. Проблема в том, что функция fisrt не правильно читает число студентов в функции allocaVettore, она выполняет динамическое выделение массива, который содержит данные файла в функции inserimento, когда массив заполняется в функции ordianmento. в функции carica есть своего рода массив, отсортированный массив записывается в файл вывода
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <fstream>
#define STR_MAX 25+1
#define MAX 100
using namespace std;
struct candidato{
int punteggio;
int eta;
char cognome[STR_MAX];
char nome[STR_MAX];
};
int leggiFile(const char * nomeFile);
candidato * allocaVettore(int numElem);
void inserimento(candidato vett[],int numElem,const char * nomeFile);
void ordinamento(candidato vett[],int numElem);
void caricaFile(const candidato vett[],int numElem,int numAmmessi);
int main(){
candidato * vett;
char nomeFile[STR_MAX];
int numElem;
int numAmmessi;
cout<<"Dimmi il nome del file da aprire"<<endl;
cin.getline(nomeFile,STR_MAX);
cin.clear();
numElem=leggiFile(nomeFile);
cout<<numElem;
if(numElem>0){
vett=allocaVettore(numElem);
if(vett!=NULL){
inserimento(vett,numElem,nomeFile);
ordinamento(vett,numElem);
do{
cout<<"Dimmi il numero di persone ammesse"<<endl;
cin>>numAmmessi;
while(cin.get()!='\n');
}while(numAmmessi<=0 || numAmmessi>numElem);
caricaFile(vett,numElem,numAmmessi);
cout<<"E' stato creato un file chiamato lista_graduatoria.txt contente i risultati"<<endl;
}
else{
exit(-1);
}
}
else{
exit(-1);
}
cin.get();
return 0;
}
int leggiFile(const char * nomeFile){
ifstream file;
int temp1;
char temp2[STR_MAX];
file.open(nomeFile);
int numElem=0;
file>>temp2;
while(file!=NULL){
file>>temp2>>temp1>>temp1;
numElem++;
file>>temp1;
}
file.close();
return numElem;
}
candidato * allocaVettore(int numElem){
candidato * vett;
vett=new candidato [numElem];
if(vett!=NULL){
return vett;
}
else{
return NULL;
}
}
void inserimento(candidato vett[],int numElem,const char * nomeFile){
ifstream file;
int i=0;
file.open(nomeFile);
char c;
file>>vett[i].cognome;
while(file!=NULL){
file>>vett[i].nome>>vett[i].punteggio>>vett[i].eta;
i++;
file>>vett[i].cognome;
}
}
void ordinamento(candidato vett[],int numElem){
int i,j;
for(i=0;i<numElem-1;i++){
for(j=i;j<numElem;j++){
if(vett[i].punteggio<vett[j].punteggio){
candidato temp;
temp=vett[i];
vett[i]=vett[j];
vett[j]=temp;
}
}
}
for(i=0;i<numElem-1;i++){
for(j=i;j<numElem;j++){
if(vett[i].punteggio==vett[j].punteggio){
if(vett[i].eta<vett[j].eta){
candidato temp;
temp=vett[i];
vett[i]=vett[j];
vett[j]=temp;
}
}
}
}
}
void caricaFile(const candidato vett[],int numElem,int numAmmessi){
int i;
ofstream outfile;
outfile.open("lista_graduatoria.txt");
outfile<<"\t LISTA AMMESSI PER IL CORSO"<<endl<<endl;
for(i=0;i<numElem;i++){
if(i<numAmmessi){
outfile<<vett[i].cognome<<" "<<vett[i].nome<<"\t "<<"punteggio:"<<vett[i].punteggio<<" \t "<<"eta:"<<vett[i].eta<<"\tAMMESSO"<<endl;
}
else{
outfile<<vett[i].cognome<<" "<<vett[i].nome<<"\t "<<"punteggio:"<<vett[i].punteggio<<" \t "<<"eta:"<<vett[i].eta<<"\tNON AMMESSO"<<endl;
}
}
outfile.close();
}