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();
}