Jump to content
Tonne

Duvida na leitura de Ficheiros

Recommended Posts

Tonne

Tenho uma duvida na leitura de ficheiros porque eu tenho que verificar de que objecto pertence ou Locais Históricos ou Locais Naturais

e depois guardar no respectivo vector e não sei como fazer eu tenho o seguinte código mas não sei como fazer a parte que mencionei em cima alguém me pode ajudar ??

Este é o código que tenho:

void Central::LerFicheiro_LocaisTuristicosNaturais(string nomefich){
string linha;
ifstream ficheiro;
ficheiro.open(nomefich);
if(!ficheiro)
cout << "Ficheiro não existe" << endl;
while (!ficheiro.eof()){
getline(ficheiro,linha,'\n');
if (linha.size() > 0){
int inicio = 0;
int pos = linha.find(',', inicio);if (pos==-1){ //se nao encontrar virgula logo ao inicio
string param1 = linha;
npost = (atoi(param1.c_str()));
}
  }
}
cout << "Ficheiro: " << nomefich << " lido com SUCESSO" << endl;
}

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

Tenho uma duvida na leitura de ficheiros porque eu tenho que verificar de que objecto pertence ou Locais Históricos ou Locais Naturais

e depois guardar no respectivo vector e não sei como fazer eu tenho o seguinte código mas não sei como fazer a parte que mencionei em cima alguém me pode ajudar ??

impossivel responder

- não dizes o que destingue um regito de um tipo ou de outro

- não dás um exemplo sequer dos dados no ficheiro

- não apresentas as declarações dos contentores que irão guardar os dados

- etc, etc ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Tonne

Os Locais (classe mãe) só tem a descrição do local depois o que destingue os Locais Naturais dos Locais Historicos é que os Locais Naturais tem Area e os locais Históricos tem Tempo Medio Visitas, Horario de Abertura e Horario de Encerramento.

Os dados devem de sair do seguinte modo :

LocTurist1,9000

LocTurist2,120,570,1110 // Tempo médio de visita 120 min. (2h) está aberto das 9:30h às 18:30h

LocTurist3,5500

LocTurist4,2300

LocTurist5,20,540,870

Share this post


Link to post
Share on other sites
HappyHippyHippo

necessitas de verificar quantas vírgulas existem na linha, se tiver uma, então é um local natural, caso contrário será um local histórico


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Tonne

boas

Ainda em relação á mesma duvida ele esta me a ler os dados todos só que esta a repetir a leitura dos dados 3 vezes em todos os dados e eu não sei porque alguem me pode ajudar ??

int inicio = 0;
  int pos = linha.find(',',inicio);
  string descricao(linha.substr(inicio,pos-inicio));
  pos++;
  inicio = pos;
  pos = linha.find(',',inicio);
  string area(linha.substr(inicio,pos-inicio));
  pos++;
  inicio = pos;
  pos = linha.find(',', inicio);
  string tMedioVisitas(linha.substr(inicio,pos-inicio));
  pos++;
  inicio = pos;
  pos = linha.find(',', inicio);
  string horarioAbertura(linha.substr(inicio,pos-inicio));
  pos++;
  inicio = pos;
  pos = linha.find(',', inicio);
  string horarioEncerramento(linha.substr(inicio,pos-inicio));

Share this post


Link to post
Share on other sites
HappyHippyHippo

o que queres dizer com :

repetir a leitura dos dados 3 vezes em todos os dado


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Tonne

desculpem não enviei todo o código


int ind = 0;
string linha ;
ifstream ficheiro;
ficheiro.open(nomefich);

if(!ficheiro)
{
 cout << "Ficheiro não existente" <<endl;
}
while(getline(ficheiro,linha,'\n'))
{

 /*if(linha.size() > 0)
 {*/
  int inicio = 0;
  int pos = linha.find(',',inicio);
  string descricao(linha.substr(inicio,pos-inicio));
  pos++;
  inicio = pos;
  pos = linha.find(',',inicio);
  string area(linha.substr(inicio,pos-inicio));
  pos++;
  inicio = pos;
  pos = linha.find(',', inicio);
  string tMedioVisitas(linha.substr(inicio,pos-inicio));
  pos++;
  inicio = pos;
  pos = linha.find(',', inicio);
  string horarioAbertura(linha.substr(inicio,pos-inicio));
  pos++;
  inicio = pos;
  pos = linha.find(',', inicio);
  string horarioEncerramento(linha.substr(inicio,pos-inicio));
 }
/*}*/
 ficheiro.close() ;

eu faço cout para ver se esta a ler bem e ele repete cada linha do ficheiro 3 vezes

Share this post


Link to post
Share on other sites
Tonne

Está aqui desculpa

int ind = 0;
string linha ;
ifstream ficheiro;
ficheiro.open(nomefich);

if(!ficheiro)
{
 cout << "Ficheiro não existente" <<endl;
}
while(getline(ficheiro,linha,'\n'))
{

 /*if(linha.size() > 0)
 {*/
  int inicio = 0;
  int pos = linha.find(',',inicio);
  string descricao(linha.substr(inicio,pos-inicio));
  pos++;
  inicio = pos;
  pos = linha.find(',',inicio);
  string area(linha.substr(inicio,pos-inicio));
  pos++;
  inicio = pos;
  pos = linha.find(',', inicio);
  string tMedioVisitas(linha.substr(inicio,pos-inicio));
  pos++;
  inicio = pos;
  pos = linha.find(',', inicio);
  string horarioAbertura(linha.substr(inicio,pos-inicio));
  pos++;
  inicio = pos;
  pos = linha.find(',', inicio);
  string horarioEncerramento(linha.substr(inicio,pos-inicio));
  cout<<descricao<<endl;
  cout<<area<<endl;
  cout<<tMedioVisitas<<endl;
  cout<<horarioAbertura<<endl;
  cout<<horarioEncerramento<<endl;
 }
/*}*/
 ficheiro.close() ;

Share this post


Link to post
Share on other sites
Tonne

LocTurist1,9000

LocTurist2,120,570,1110

LocTurist3,5500

LocTurist4,2300

LocTurist5,20,540,870

Share this post


Link to post
Share on other sites
HappyHippyHippo

e o output é ?

LocTurist1,9000,9000,9000 
LocTurist2,120,570,1110
LocTurist3,5500,5500,5500 
LocTurist4,2300,2300,2300 
LocTurist5,20,540,870 

é mais fácil ter um filho que sacar-te a porcaria da informação necessária ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Tonne

O que eu acho que acontece é que se ela ao fim se não encontrar uma virgula vai ler outra vez a linha anterior

Share this post


Link to post
Share on other sites
HappyHippyHippo

ok ... mais uma vez vou ter que explicar tim tim por tim tim ...

primeira linha : LocTurist1,9000


  int inicio = 0;
  int pos = linha.find(',',inicio);                  // pos = 10
  string descricao(linha.substr(inicio,pos-inicio)); // descricao = "LocTurist1"
  pos++;                                             // pos = 11
  inicio = pos;                                      // inicio = 11
  pos = linha.find(',',inicio);                      // pos = -1
  string area(linha.substr(inicio,pos-inicio));      // area = linha.substr(11, (size_t) -1 -11)
                                                     //      = linha.substr(11, <numero positivo muito grande>)
                                                     //      = 9000
  pos++;                                             // pos = 0
  inicio = pos;                                      // inicio = 0
  pos = linha.find(',', inicio);                     // pos = -1

// patati, patata ...

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.