Lettura da File Struct

92Nick92
Non riesco davvero a capire perchè questo codice così semplice mi stia dando problemi:
#include <iostream>
#include <fstream>

using namespace std;
int const Max_candidati=50;
struct persona
{   int Id_candidato;
    string nome;
    string cognome;
    string data;
    int voto;

};
struct persona candidato[Max_candidati];

int main(){
{int n_candidati=0;
    ifstream leggi;
    leggi.open("C:\\Users\\Vittorio\\Desktop\\Lista.txt");
    while(!leggi.eof())
    {
        leggi >>candidato[n_candidati].Id_candidato;
        leggi >>candidato[n_candidati].nome;
        leggi >>candidato[n_candidati].cognome;
        leggi >>candidato[n_candidati].data;
        leggi >>candidato[n_candidati].voto;
        n_candidati++;
    }
leggi.close();

for(int i=0;i<n_candidati;i++)
{
       cout<<candidato[i].Id_candidato;
        cout<<candidato[i].nome;
        cout<<candidato[i].cognome;
        cout<<candidato[i].data;
        cout<<candidato[i].voto;
}

}
}

Riesco a compilare senza errori,ma la finestra rimane vuota..cosa che solitamente accade quando si ha problemi con il percorso del file...ma sono sicuro che sia corretto..:S
(il file di testo è così composto:
1
Aldo
Esposito
12/01/1994
M
30
2
Carlo
Rossi
01/03/1958
M
50
3
Annamaria
Verde
12/12/1962
......)

Risposte
onlyReferee
Ciao 92Nick92 :!:
Se osservi bene come è composto il file stai cercando di memorizzare in una variabile di tipo intero (il campo età della struttura) un carattere (quello relativo al sesso). Anche nel caso non ti interessasse poi stamparlo bisogna comunque che lo leggi per poter avanzare nel file col puntatore.
Ti metto di seguito il codice corretto dove non stampo il sesso. Poi chiaramente puoi modificare la stampa secondo le tue necessità e preferenze.
Infine: non ho capito perché tu abbia messo due parentesi graffe di seguito quando prima del corpo del main (ed anche alla fine dello stesso). Ne basta una sola :wink: .
Spero di esserti stato d'aiuto e soprattutto che tu abbia potuto comprendere quale era il problema.
#include <iostream>
#include <fstream>

using namespace std;
int const Max_candidati=50;
struct persona
{   int Id_candidato;
    string nome;
    string cognome;
    string data;
    int voto;

};
struct persona candidato[Max_candidati];

int main(){
	int n_candidati = 0;
	char sesso;

    ifstream leggi;
    leggi.open("C:\\Users\\Riccardo\\Desktop\\Lista.txt");
    while(!leggi.eof()){
        leggi >> candidato[n_candidati].Id_candidato;
        leggi >> candidato[n_candidati].nome;
        leggi >> candidato[n_candidati].cognome;
        leggi >> candidato[n_candidati].data;
        leggi >> sesso;
        leggi >> candidato[n_candidati].voto;
        n_candidati++;
    }
    leggi.close();

    for(int i = 0; i < n_candidati; i++){
    	cout << candidato[i].Id_candidato << "\n";
		cout << candidato[i].nome << "\n";
		cout << candidato[i].cognome << "\n";
		cout << candidato[i].data << "\n";
		cout << candidato[i].voto << "\n\n";
	}
}

92Nick92
Oddio...xD
la traccia era sbagliata:
Scrivere un programma in C++ che sia in grado di leggere da un file, dal nome candidati.txt, una lista di candidati. Le informazioni sono così strutturate una per ogni riga.
Id_candidato (riga i-esima)
Nome (riga i+1-esima)
Cognome (riga i+2-esima)
Data_di_nascita (riga i+3-esima)
Voti (riga i+4-esima)
E quindi non mi ero soffermato su quello che ci fosse scritto all'interno del file...Comunque grazieee :-D
(la parentesi era semplicemente una distrazione xD)

92Nick92
Scusate ragazzi,approfitto di questo post per fare un'altra piccola domanda,evitando di creare un ulteriore post:
Scrivere un programma in C++ che sia in grado di leggere da un file in cui siano memorizzati una serie di nomi di persona.
I nomi presenti nel file, dal nome nomi.txt, sono memorizzati uno per riga e l’ultima riga presenta la stringa “Fine dati”, che indica la conclusione degli elementi da leggere.
Ipotizzare che ci siano almeno 10 nomi e costruire il relativo file nomi.txt e che uno stesso nome sia ripetuto più volte.
Organizzare il programma con un main con chiamate a funzione per:
1) Caricare e visualizzare a video la lista dei nomi presenti nel file nomi.txt
2) A video, visualizzare i nomi con l’indicazione del numero di ripetizioni dei nomi presenti nel file

Il punto 2 di quest'esercizio è possibile risolverlo senza l'utilizzo di una struct??
Vi sembrerà una domanda stupida,ma il professore all'esame dà la prova solo su "un" argomento(vettori,matrici,struct),quindi se questo è un esercizio sui vettori non DEVO usare le struct.Purtroppo il professore non risponde e rimango col dubbio..quindi ripeto la domanda:si può risolvere quel punto utilizzando solo i vettori?(cosa che per adesso non sono riuscito a fare...xD)

onlyReferee
Sì, sicuramente lo puoi fare senza utilizzare le struct. Chiaramente in tal caso la complessità dell'algoritmo aumenta quasi necessariamente un pochettino ma, da come ho capito, questo non dovrebbe costituire un problema.

92Nick92
E come cavolo si fa??XD
#include <iostream>
#include <fstream>
using namespace std;
int const Max_Dim=100;
int ContNomi[Max_Dim];

string NomiLista[Max_Dim];


void CaricaNomi(char NomeFile[],string Nomi[],int &numero)
{
    numero=0;
    ifstream leggi;
    leggi.open(NomeFile);
    while(!leggi.eof())
    {

        leggi>>Nomi[numero];
        if(Nomi[numero]=="Fine")
            break;
        numero++;

    }
leggi.close();
}
void VisualizzaNomi(string Nomi[],int numero)
{
    for(int i=0;i<numero;i++)
    {
        cout<<Nomi[i]<<endl;
    }
}
/*void ContaNomi(string Nomi[],int numero,)
{
    for(int i=0;i<numero;i++)
    {for(int j=i+1;j<numero;j++)
    {if(Nomi[i]==Nomi[j])
    ContNomi[i]++;


    }

    }
}*/

int main()
{

    int n_lista;
    CaricaNomi("C:\\Users\\Vittorio\\Desktop\\ElencoNomi.txt",NomiLista,n_lista);
    VisualizzaNomi(NomiLista,n_lista);

    return 0;
}

Questo è quel poco che sono riuscito ad abbozzare.. :|
Mi sono arenato sul problema " stampare senza ripetizioni"...come faccio a far capire al compilatore che per un determinato nome è stata già fatta la ricerca??:S

vict85
Mi rendo conto che non puoi usarlo all'esame ma il codice più "semplice" per fare questa cosa è il seguente (questo è c++11 ma un codice simile è possibile anche con il C++ degli standard precedenti):

#include <string>
#include <iostream>
#include <map>
#include <fstream>


int main(){
	
	std::ifstream leggi;
	leggi.open("TUO\\INDIRIZZO\\FILE");
	
	std::map<std::string, size_t> word_map;

	std::string s;
	while (leggi >> s)
		++word_map[s];

	for (const auto &pair : word_map) {
		std::cout << pair.first << ' ' << pair.second << std::endl;
	}

	return 0;
}


Comunque puoi benissimo usare un vector di struct.

92Nick92
Grazie :-D

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