Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha


Comunidades

Comunidade Linux Home Participar da comunidade Linux Participar Fórum Linux Fórum Membros LinuxMembros RSS do fórum

<< Primeira | Anterior Próxima | Última >>

Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]

[1] Enviado em 10/02/2012 - 17:13h Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]
Linux user: Nicole Pereira
nicolepereira10

(usa Ubuntu)


Olá,


Estou fazendo um programa em que eu preciso ler determinadas colunas de um arquivo, principalmente a segunda, só que esse arquivo tem muitas colunas, é enorme, inclusive. Alguém tem uma função para me indicar em que eu possa ler todos os dados dessa coluna apenas? Eu estava usando o fscanf para ler a primeira e a segunda coluna e tentei colocar um \n para ele iniciar a leitura na próxima vez que o laço mandar na linha de baixo, só que não deu certo. :/


Obrigada!

 

  


[2] Enviado em 10/02/2012 - 18:15h Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]
Linux user: ???
gokernel

(usa Conectiva)


Depende muito da formatacao do seu "banco de dados " ...

Se o programa for so em modo texto a dica seria formatar o seu arquivo de dados +ou- assim, exemplo de uma linha:
-------------------------------------------------
<nome>nome da pessoa<cidade>nome da cidade<endereco>rua bla bla bla<end>
-------------------------------------------------

Ou usar como separação de colunas isso ( <> ) inclusive no final da linha.

Ou se for em modo GUI eu exibiria em uma ListView e usaria o método similar ao anterior para gravar no arquivo de dados simples.

É +ou- essa lógica.

 

[3] Enviado em 10/02/2012 - 18:38h Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]
Linux user: euteste da silva
foxbit3r

(usa Solaris)


coloca um pedaço do arquivo que vc precisa ler.

 

[4] Enviado em 10/02/2012 - 19:16h Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]
Linux user: Nicole Pereira
nicolepereira10

(usa Ubuntu)


Então, segue um pedaço do arquivo que eu quero ler:


0.000000e+00 4.185024e+02 2.170000e-01 (...)
2.663000e+01 1.094000e+02 1.436000e+02 (...)
3.330000e+02 -2.481290e-02 3.341820e+02 (...)
5.200000e+00 4.185024e+02 2.170000e-01 (...)
(...) (...) (...)


E essa é a ideia do meu programa:

j=0;
while(!feof(arq1))
{


fscanf(arq1,"%lf %lf \n",&t,&a);

fscanf(arq2,"%lf %lf \n",&t2,&b);

n = (pow((a-b),2)+n);


j++;
}

Queria ler só a segunda coluna de dois arquivos iguais ao de cima, ali eu leio a primeira tbm só que não utilizo, mas não posso fazer isso quanto ao resto das colunas pois são muitas...



 

[5] Enviado em 10/02/2012 - 23:07h Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]
Linux user: Joao
stack_of

(usa Slackware)


Esse arquivo de banco de dados apresentado separa as colunas com delimitadores fixos (um espaço, apenas um TAB, vírgula, ponto-e-vírgula, etc)?

 

[6] Enviado em 10/02/2012 - 23:11h Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]
Linux user: euteste da silva
foxbit3r

(usa Solaris)


Dá uma olhada e vê se isso te ajuda.
Eu coloquei as informações que vc passou num arquivo chamado dados.txt

#include <stdio.h>
#include <string.h>

#define ESPACO " "
int main(){

  char str1[50];
  char *pt;
  int countPos;
  double val;

  FILE *fp;
  fp = fopen ("dados.txt", "r");

  while(fgets(str1,50,fp)){
     countPos=0;
     pt = strtok(str1,ESPACO);
     while(pt != NULL){
        if(countPos == 1){
            sscanf(pt,"%lf",&val);
            printf("%lf\n",val);
        }
        pt = strtok(NULL,ESPACO);
        countPos++;
     }
  }
  fclose(fp);
}


 

[7] Enviado em 10/02/2012 - 23:33h Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]
Linux user: Joao
stack_of

(usa Slackware)


Imaginei algo semelhante, inclusive utilizo as mesmas funções.

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#define del " -,   "

void main(void){
   
   FILE *fp;
   FILE *res;
   char str[LINE_MAX];
   char *strf;
    int i;
   
   if ((fp = fopen("arquivo", "r")) == NULL){
      printf("Arquivo inexistente?");
      exit(1);
   }
      if ((res = fopen("arquivo_destino", "w")) == NULL){
      printf("Arquivo inexistente?");
      exit(1);
   }
   
   while((fgets(str, LINE_MAX, fp)) != NULL){
   
   i = 0;
   strf = strtok(str, del);
   while(strf != NULL){
   
      if(i == 1){
      fputs(strf, res);
      
   }
   strf = strtok(NULL, del);
       i++;
   }
   }
      
      fclose(fp);
      fclose(res);
}


 

[8] Enviado em 11/02/2012 - 00:29h Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]
Linux user: Marcelo A. B. Slomp
mslomp

(usa Slackware)


foxbit3r escreveu:

Dá uma olhada e vê se isso te ajuda.
Eu coloquei as informações que vc passou num arquivo chamado dados.txt

#include <stdio.h>
#include <string.h>

#define ESPACO " "
int main(){

  char str1[50];
  char *pt;
  int countPos;
  double val;

  FILE *fp;
  fp = fopen ("dados.txt", "r");

  while(fgets(str1,50,fp)){
     countPos=0;
     pt = strtok(str1,ESPACO);
     while(pt != NULL){
        if(countPos == 1){
            sscanf(pt,"%lf",&val);
            printf("%lf\n",val);
        }
        pt = strtok(NULL,ESPACO);
        countPos++;
     }
  }
  fclose(fp);
}


com sua permissão, apenas dois adendos visando otimizar o seu algoritmo para leituras intensivas de dados:
1 - no 2o while, ao atingir a condição countPos == 1, adicionar um break para sair imediatamente desse laço, evitando parsear em vão os próximos tokens de cada linha que por ventura strtok encontre:


while(fgets(str1,50,fp)){
     countPos=0;
     pt = strtok(str1,ESPACO);
     while(pt != NULL){
        if(countPos == 1){
            sscanf(pt,"%lf",&val);
            printf("%lf\n",val);
            break;  /* <==== */
        }
        pt = strtok(NULL,ESPACO);
        countPos++;
     }
}


2 - mais ainda, visto que sempre e apenas o 2o valor deve ser obtido, pode-se pular diretamente para o 2o token, evitando-se assim o 2o while:


while(fgets(str1,50,fp)){
     pt = strtok(str1,ESPACO);
     pt = strtok(NULL,ESPACO);
     sscanf(pt,"%lf",&val);
     printf("%lf\n",val);      
}


em um arquivo grande como o mencionado pela autora do tópico, um desses ajustes - em especial o segundo - fará grande diferença no tempo de leitura/processamento.

 

[9] Enviado em 11/02/2012 - 02:14h Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]
Linux user: Nicole Pereira
nicolepereira10

(usa Ubuntu)


Muito Obrigada!
Utilizando as ideias de vcs consegui fazer funcionar.

 

[10] Enviado em 11/02/2012 - 19:53h Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]
Linux user: euteste da silva
foxbit3r

(usa Solaris)


Obrigado mslomp,

Eu não tinha pensado nisso na hora.


 

  
<< Primeira | Anterior Próxima | Última >>
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.