Lettura da File Struct

Messaggioda 92Nick92 » 13/09/2014, 11:14

Non riesco davvero a capire perchè questo codice così semplice mi stia dando problemi:
Codice:
#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
......)
92Nick92
Junior Member
Junior Member
 
Messaggio: 52 di 114
Iscritto il: 29/01/2012, 21:42

Re: Lettura da File Struct

Messaggioda onlyReferee » 13/09/2014, 13:35

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.
Codice:
#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";
   }
}
Per aspera sic itur ad astra
onlyReferee
Advanced Member
Advanced Member
 
Messaggio: 475 di 2046
Iscritto il: 20/08/2013, 21:20
Località: Musile di Piave (VE)

Re: Lettura da File Struct

Messaggioda 92Nick92 » 13/09/2014, 13:44

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
Junior Member
Junior Member
 
Messaggio: 53 di 114
Iscritto il: 29/01/2012, 21:42

Re: Lettura da File Struct

Messaggioda 92Nick92 » 13/09/2014, 15:56

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)
92Nick92
Junior Member
Junior Member
 
Messaggio: 54 di 114
Iscritto il: 29/01/2012, 21:42

Re: Lettura da File Struct

Messaggioda onlyReferee » 13/09/2014, 16:49

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.
Per aspera sic itur ad astra
onlyReferee
Advanced Member
Advanced Member
 
Messaggio: 477 di 2046
Iscritto il: 20/08/2013, 21:20
Località: Musile di Piave (VE)

Re: Lettura da File Struct

Messaggioda 92Nick92 » 13/09/2014, 16:58

E come cavolo si fa??XD
Codice:
#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
92Nick92
Junior Member
Junior Member
 
Messaggio: 55 di 114
Iscritto il: 29/01/2012, 21:42

Re: Lettura da File Struct

Messaggioda vict85 » 13/09/2014, 18:31

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):

Codice:
#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.
vict85
Moderatore
Moderatore
 
Messaggio: 6793 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: Lettura da File Struct

Messaggioda 92Nick92 » 16/09/2014, 17:05

Grazie :-D
92Nick92
Junior Member
Junior Member
 
Messaggio: 56 di 114
Iscritto il: 29/01/2012, 21:42


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite