Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ulfreitas

[Resolvido] Como ler determinado dado do arquivo

Recommended Posts

Boa tarde pessoal

Ainda com dúvida em arquivo, como seleciono um determinado dado?

Por exemplo, tenho estes dados em um arquivo:

Nº do Carro Milhas Dirigidas Galões de gasolina usados

----------- ---------------- -------------------------

54 250 19

62 525 38

71 123 6

85 1322 86

97 235 14

 

tenho que criar uma função para ler o numero do carro as milhas dirigidas e os galões usados por esse veículo.

minha dúvida é quando eu for ler as informações do arquivo como faço para pular as duas primeira linhas e pegar apenas os valores?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde pessoal

Ainda com dúvida em arquivo, como seleciono um determinado dado?

Por exemplo, tenho estes dados em um arquivo:

 

 

tenho que criar uma função para ler o numero do carro as milhas dirigidas e os galões usados por esse veículo.

minha dúvida é quando eu for ler as informações do arquivo como faço para pular as duas primeira linhas e pegar apenas os valores?

 

ulfreitas,

 

Para ler uma linha ou uma string de um arquivo,você pode usar umas destas funções:

http://www.cplusplus.com/reference/clibrary/cstdio/fread/

ou

http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

 

E para pular linhas, não conheço uma função pronta que faça isto. O que normalmente faço, é ler byte a byte do arquivo e quando encontrar um "\n" ou em hex um 0x0A sei que é fim de uma linha.

 

Use esta função para ler byte a byte:

http://www.cplusplus.com/reference/clibrary/cstdio/fgetc/

 

Mas se você conhecer exatamente o tamanho de cada registro(lê-se registro como cada linha contida no arquivo), você pode pular as linhas reposicionando o ponteiro. Sem esquecer de contar o Line Feed 0x0A e em alguns casos o carriege return 0x0D.

Função para posicionar o ponteiro:

http://www.cplusplus.com/reference/clibrary/cstdio/fseek/

 

Espero ter ajudado,FLW! :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa não tinha pego a formatação.

No arquivo os dados estarão assim:

Nº do Carro     Milhas Dirigidas     Galões de gasolina usados
-----------     ----------------     -------------------------
54              250                  19
62              525                  38
71              123                  6
85              1322                 86
97              235                  14

 

tenho que criar uma função para acrescentar os dados nesse arquivo, da forma como aparece ai, e outra função para mostrar os dados.

 

Para acrescentar é fácil só usar o modo de inserção no arquivo ("arquivo_taltal","a"), ele vai acrescentar no final do arquivo dando continuidade, mas as duas primeira linhas para nao ficar repetindo toda vez que eu fora acrescentar novos dados? e os espaços entre uma coluna e outra? acho que posso usar uma matriz, se for o caso as duas primeira linhas da matriz que conteriam as strings(n do carro, milhas dirigidas, galoes de gasolina) e (-----------) eu poderia pular.

 

Mas ai teria outro problema, com o tamanho dessa matiz :pinch: , não poderia ter um tamanho fixo, ela teria que acrescentar linha conforme eu for cadastrando novos veículos é possível fazer isso?

 

Como resolvo isso?

 

GBecker

Ler linha a linha parece ser uma boa opção.

Mas e para cadastrar como faria pra ficar um de baixo do outro como uma tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ulFreitas,

 

1)

Para acrescentar é fácil só usar o modo de inserção no arquivo ("arquivo_taltal","a"), ele vai acrescentar no final do arquivo dando continuidade, mas as duas primeira linhas para nao ficar repetindo toda vez que eu fora acrescentar novos dados? e os espaços entre uma coluna e outra? acho que posso usar uma matriz, se for o caso as duas primeira linhas da matriz que conteriam as strings(n do carro, milhas dirigidas, galoes de gasolina) e (-----------) eu poderia pular.

 

No caso das duas linhas iniciais, podes fazer uma lógica para só inserir elas o quando arquivo não existir ainda, ou seja na criação do arquivo pela primeira vez. Como você esta usando o modo append "a", vai gravar no final do arquivo mantendo os dados que lá já estavam.

A ideia da matriz é boa para melhorar o desempenho do programa. Quando se abre e fecha um arquivo para operações esta gastando um certo tempo, mesmo que seja mínimo. Neste caso a perda é pequena, mas arquivos maiores e registros maiores pode fazer diferença.

Com a matriz poderia inserir os campos na matriz e no fim antes de fechar o programa gravar no arquivo ou quando tiver um certo numero de registros na matriz, 10 por exemplo, realizar a gravação

 

2)

Mas ai teria outro problema, com o tamanho dessa matiz, não poderia ter um tamanho fixo, ela teria que acrescentar linha conforme eu for cadastrando novos veículos é possível fazer isso?

 

Como resolvo isso?

Nesta parte, depende de como você vai fazer. Se fizer como mencionei que a cada 10 registros grava no arquivo o tamanho da matriz pode ser o teu sinalizador de quando deve gravar no arquivo, só que teria que ficar controlando a quantidade de registros disponíveis na matriz.

Se fizer da outra forma, gravar no arquivo quando for fechar o programa. Terá que utilizar matriz alocada dinamicamente. E conforme for incluindo, aloca uma linha a mais.

 

3)

GBecker

Ler linha a linha parece ser uma boa opção.

Mas e para cadastrar como faria pra ficar um de baixo do outro como uma tabela.

 

Neste caso basta garantir que a cada registro gravado, seja incluido uma nova linha no arquivo. Posicionando, após a escrita, sempre na linha vazia.

Monta a string com os dados e no final inclui um \n(no caso do Linux) ou \r\n(no caso do windows).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ow GBecker, acabei fazendo assim:

 

#include <stdio.h>
#include <stdlib.h>

typedef struct {
   int carro, milhas, galao;
} Consumo; 

int Cadastro (FILE *arq);
int Relatorio(FILE *arq);

int main()
{
   int opc;
   FILE *arquivo;

   if((arquivo = fopen("Consumo.txt","r")) == NULL){
       if((arquivo = fopen("Consumo.txt","w")) == NULL){
           return 1;
       }
       fprintf(arquivo,"%s %s %s %s\n%s %s %s %s\n", "N Carro"," Milhas Dirigidas"," Galoes de Gasolina"," Milhas por Galao", "-------"," ----------------"," ------------------"," ----------------");
   }
   fclose(arquivo);

   for(;;){
       system("cls");
       printf("<1> Cadastrar Consumo\n<2> Gerar Relatorio\n<3> Sair\n");
       scanf("%d%*c",&opc);

       switch(opc){
           case 1 :
               system("cls");
               Cadastro(arquivo);
               break;
           case 2 :
               system("cls");
               Relatorio(arquivo);
               break;
           case 3 :
               exit(0);
           default :
               system("cls"); 
               printf("Opcao invalida\n\n<ENTER> Voltar ao menu\n");
               scanf("%*c");
               break;
       }
   }

   return 0;
}

int Cadastro(FILE *arq){
   char opc;
   Consumo c;

   if((arq = fopen("Consumo.txt","a")) == NULL) return 1;

   do{
       printf("Informe o numero do carro: ");
       scanf("%d%*c",&c.carro);
       printf("Informe as milhas percorridas: ");
       scanf("%d%*c",&c.milhas);
       printf("Informe os galoes gastos: ");
       scanf("%d%*c",&c.galao);
       fprintf(arq,"%d %9d %16d %19d\n", c.carro, c.milhas, c.galao, (c.milhas/c.galao));
   }while(opc == 's');

   fclose(arq);
}

int Relatorio(FILE *arq){
   char ch;
   Consumo c;

   if((arq = fopen("Consumo.txt","r")) == NULL) return 1;

   rewind(arq);
   while( fscanf(arq,"%c",&ch) != EOF){
       printf("%c",ch);
   }
   scanf("%*c");
   fclose(arq);
}

Nem usei matriz achei q iria complicar de mais.

No main eu uso modo de leitura "r" pra ver se já tem o arquivo, se nao tiver eu uso modo de leitura "w" pra criar e já colocar as duas primeiras linhas que são duas strings, achei esse método que usei meio duvidoso mas não consegui pensar em outra forma, como você faz?

 

Na função Cadastro vou cadastrando normal com modo "a". No cadastro eu coloquei uns %d com numero de espaço tipo %9d %16d pra dar os espaços de uma coluna pra outra, deu certo até certo ponto, se a pessoa digita numeros com casas a mais ou a menos sai tudo de ordem, essa parte ficou muito braba.

 

Na função Relatório usei leitura caracter a caractere como você sugeriu.

 

Alguma sugestão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nem usei matriz achei q iria complicar de mais.

No main eu uso modo de leitura "r" pra ver se já tem o arquivo, se nao tiver eu uso modo de leitura "w" pra criar e já colocar as duas primeiras linhas que são duas strings, achei esse método que usei meio duvidoso mas não consegui pensar em outra forma, como você faz?

 

Faço assim também, se usar só "w" apaga o que já estava gravado nele. Normalmente para escrita abro o arquivo em modo apend "a", que abre o arquivo e já posiciona o ponteiro de escrita no fim do mesmo.

 

Na função Cadastro vou cadastrando normal com modo "a". No cadastro eu coloquei uns %d com numero de espaço tipo %9d %16d pra dar os espaços de uma coluna pra outra, deu certo até certo ponto, se a pessoa digita numeros com casas a mais ou a menos sai tudo de ordem, essa parte ficou muito braba.

 

Na função Relatório usei leitura caracter a caractere como você sugeriu.

 

Alguma sugestão?

 

Para inserir os espaços sem tirar a formatação é mas complicado.

Você pode tentar fazer o seguinte:

1) Definir uma quantidade padrão de espaços, ex.: se o usuário não digitar nada vai ter 10 espaços.

2) Depois que o usuário digitar o dado, contar quantos dígitos tem o dado.

3) De posse da informação da quantidade digitada, diminuir do define e vais saber a quantidade de espaços que tens de inserir.

Entendeu? definir a quantidade de espaços de forma "pseudo dinâmica".

 

Como você esta utilizando %d, poderia que mudar para %s. Pois fica mais fácil de contar uma string, por exemplo, através do método strlen(). E se queiser voltar o dado para o %d, podes utilizar a função atoi().

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

 

Acho que é isso...

Espero ter ajudado, FLW!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.