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

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

Nicole Pereira
nicolepereira10

(usa Ubuntu)

Enviado em 10/02/2012 - 17:13h

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. Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 10/02/2012 - 18:15h

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. Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 10/02/2012 - 18:38h

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


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

Nicole Pereira
nicolepereira10

(usa Ubuntu)

Enviado em 10/02/2012 - 19:16h

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. Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]

Joao
stack_of

(usa Slackware)

Enviado em 10/02/2012 - 23:07h

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. Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 10/02/2012 - 23:11h

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. Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]

Joao
stack_of

(usa Slackware)

Enviado em 10/02/2012 - 23:33h

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. Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 11/02/2012 - 00:29h

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. Re: Funções para leitura de dados em arquivo - Dúvida [RESOLVIDO]

Nicole Pereira
nicolepereira10

(usa Ubuntu)

Enviado em 11/02/2012 - 02:14h

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


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

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 11/02/2012 - 19:53h

Obrigado mslomp,

Eu não tinha pensado nisso na hora.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts