в этой программе читается файл, в котором содержится много студентов. в каждой строке указывается фамилия - PullRequest
0 голосов
/ 07 ноября 2019

в этой программе читается файл, в котором содержится много студентов. В каждой строке есть фамилия, имя, отметка и возраст учащегося, которому принадлежат данные. Проблема в том, что функция 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();
}
...