Errore del ciclo

di il
1 risposte

Errore del ciclo

Salve, ho questo codice, ma non riesco a prelevare i caratteri e memorizzarli come vorrei.
Dovrei aprire il file dati.txt, scorrere i primi caratteri finchè trova la virgola,
memorizzandoli nell'array dade[1].nome, poi a eta, quando arriva a \n
dovrebbe andare a capo e memorizzare in dade[2].nome, cognome, eta e così via.
La prima linea funziona bene. Il problema è che quando ricomincia il ciclo, fgetc()
salta i caratteri o li mette secondo una logica che non mi è affatto chiara.
Non potevano fare una funzione più semplice?
Potreste darmi una mano a capire il motivo dell'errore?

PS Dove c'è scritto a<4 si potrebbe mettere EOF, in modo che il file txt sia elaborato
fino alla fine? perchè mi da sempre problemi di segmentation fault

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <fstream>
using namespace std;

int main(){

struct dati {
char* nome;
char* cognome;
char* eta;
};

dati dade[20];
char cerca[20];

for(int i=0; i<20; i++){
dade[i].nome=(char*)malloc(sizeof(char)*20);
dade[i].cognome=(char*)malloc(sizeof(char)*20);
dade[i].eta=(char*)malloc(sizeof(char)*20);
}

FILE* files;
files=fopen("dati.txt","r");

//ripeti il ciclo finche finisce il file 
//for(int b=0;s=fgetc(files)!=EOF;b++){

int i=0,a=0;

while (a<4){ //per prova, poi bisognerà farlo fino alla fine del file
	while(dade[a].nome[i]!=',') {
		dade[a].nome[i]=fgetc(files);
		if(dade[a].nome[i]==','){
			dade[a].nome[i]=0; 
			break;
		}
		i++;
	}
	i=0;
	while(dade[a].cognome[i]!=',') {
		dade[a].cognome[i]=fgetc(files);
		if(dade[a].cognome[i]==','){
			dade[a].cognome[i]=0; 
			break;
		}
		i++;
	}
	i=0;
	while(dade[a].eta[i]!='\n') {
		dade[a].eta[i]=fgetc(files);
		if(dade[a].eta[i]=='\n'){
			dade[a].eta[i]=0; 	
			break;
		}
		i++;
	}
	a++;
}

//}


fclose(files);

cout << "Cerca: ";
cin.getline(cerca,sizeof(cerca));
cerca[0]=toupper(cerca[0]);

cout <<"Nome\tCognome\t\tEta"<<endl;

for(int a=0; strlen(dade[a].nome)>1;a++){
	if(strncmp(cerca,dade[a].nome, 4)==0 || strncmp(cerca,dade[a].cognome, 4)==0){
		cout << dade[a].nome << "\t" << dade[a].cognome << "\t" << dade[a].eta << endl;
		return main();		
		} 
	}
	cout << "Risultato non trovato"<<endl;
	return main();
}

1 Risposte

Devi accedere o registrarti per scrivere nel forum
1 risposte