Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Squadfury

Leitura de ficheiros

Mensagens Recomendadas

Squadfury

Ola pessoal..

Eu preciso de ajuda: Criei uma função que lê dados de um ficheiro e utiliza os dados para atribuir às diversas variáveis existentes e serve como alternativa ao insere dados na consola... A leitura dos dados é sequencial e o ficheiro so pode conter os dados a atribuir às variàveis:

void lePlanos(Lista& empres){
string titulo, instituiçao, empresario,linha;
double dconsumiveis, dconsultores,  compraEquip, deslocaçoes;
int duraçao;
int codigo = 0;

ifstream ficheiro;
ficheiro.open("exemplo.txt");

if (ficheiro.is_open() && ficheiro.good())
{
ficheiro.seekg(ios::beg);
ficheiro.clear();
cout << endl << "A ler dados..." << endl;
while ( ficheiro>>linha)
{
Lista * novo = new Lista();

getline(ficheiro, titulo);
cout << titulo;
novo->titulo = titulo;

getline(ficheiro, instituiçao);
cout << instituiçao;
novo->instituicao = instituiçao;

getline(ficheiro, empresario);
cout << empresario;
novo->empresario = empresario;

ficheiro >> dconsumiveis;
cout << dconsumiveis;
novo->gastos.dconsumiveis = dconsumiveis;

ficheiro >> dconsultores;
cout << dconsultores;
novo->gastos.dconsultores = dconsultores;

ficheiro >> compraEquip;
cout << compraEquip;
novo->gastos.compraEquip = compraEquip;

ficheiro >> deslocaçoes;
cout << deslocaçoes;
novo->gastos.deslocaçoes = deslocaçoes;

codigo = codigo + 1;
novo->codigo = codigo;

novo->seguinte = empres.seguinte;
empres.seguinte = novo;
cout << "-- -" << endl;
}

infile.close();
}

}

Eu queria saber se há possibilidade do exemplo.txt ser do tipo

titulo: vert

Instituiçao: Anac

Empresario; Pedro

Gastos consumiveis: 550

Gastos Consultores: 1230

Compra de equipamento: 890

gastos com Deslocações: 230

em vez de:

vert

Anac

Pedro

550

1230

890

230

Obrigado

Editado por Squadfury

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo
char buffer[256];

while(ficheiro.good()) {
 ficheiro.getline(buffer, 256)
 if (ficheiro.good()) {
   string line(buffer);
   string key = line.substr(0, line.find(':'));
   string value = line.substr(line.find(':') + 1);

        if (key == "batatas) {  }
   else if (key == "cebolas") {  }
   else if (key == "repolho") {  }
 }
}


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Squadfury

Obrigado... consegui fazer para a parte das strings, mas tenho algumas dúvidas em relação aos tipo Int e double, pelo menos não estou a conseguir... se pudesse dar uma dica sff seria otimo.

cumprimentos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

int n;
std::string str = "32";

sscanf(str.c_str(), "%d", &n);
printf("%d\m", n);

nota: uma boa razão para saber C antes de C++


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Squadfury

int n;
std::string str = "32";

sscanf(str.c_str(), "%d", &n);
printf("%d\m", n);

nota: uma boa razão para saber C antes de C++

Esta parte está a escapar-me, após a leitura de dados do ficheiro eu vou ver os dados inseridos e na parte

dos inteiros e doubles aparecem erros. Ele está a ler tudo. eu fiz assim:

string linha;
int dconsumiveis;

ficheiro >> dconsumiveis;
string key = linha.substr(0, linha.find(':'));
string value = linha.substr(linha.find(':') + 1);
sscanf(value.c_str(), "%d", &dconsumiveis);
novo->gastoproj.dconsumiveis = dconsumiveis;

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

... olha bem para o que acabaste de apresentar aqui ...

após cada linha desse código coloca um comentário a dizer o que está a fazer


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Squadfury

Pois, deve ter havido alguma coisa que eu não entendi bem...

string linha; 
int dconsumiveis; // variável que irá guardar o valor dos consumíveis

ficheiro >> dconsumiveis; // a leitura que é feita nessa linha vai entrar na variavel dconsumiveis
string key = linha.substr(0, linha.find(':')); // cria uma string que guarda o que é anterior a ":"
string value = linha.substr(linha.find(':') + 1);// cria uma string que guarda o que é posterior a ":"
sscanf(value.c_str(), "%d", &dconsumiveis); // recebe a informação presente em value e guarda em dcomsumiveis
novo->gastoproj.dconsumiveis = dconsumiveis;

Ja percebi que o sscanf não trabalha da maneira que eu descrevi, mas também não estou bem a ver como ele vai trabalhar neste caso... :confused:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Squadfury

por mais que olhe para a tua resposta não sei o que te responder ... desculpa ...

Ok, não há problema,,, é estudar e procurar mais e chega-se lá. Agradeço muito a ajuda e a paciência...

cumprimentos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.