Acessando campos de arquivos txt - C

1. Acessando campos de arquivos txt - C

Marcelo Conceição
marceloc

(usa Debian)

Enviado em 26/06/2006 - 17:41h

Olá,

Sou novo em programação e estou com dificuladades em resolver uma problema:

Tenho um código e três arquivos txt, onde dois são para leitura e o terceiro será para gravação.

Ex: No aquivo carta.txt eu tenho alguns campos delimitados por << >> (<<nome>>, <<data>>, etc.).
Já no arquivo dados_carta.txt eu tenho os dados que irão nestes campos separados por ponto e vírgula (João;15/05/2006).

A leitura e gravação no terceiro arquivo eu consegui fazer, mas preciso vincular os campos de um arquivo com outro.

Alguém pode me ajudar?

Segue abaixo o código do que foi feito até agora:

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

char valor [10][50];
char linha[100];
char nvalor = 0;

//char dados [10][20][50];

void separa_nomes(char nomes[]) {
int i=0;
char nome[40];
int j = 0;

printf ("\n*nomes: %s \n", nomes);

i = 0;
while(i<=strlen(nomes)){
while (i<=strlen(nomes) && nomes[i]!=';' ) {
nome[j] = nomes[i];
j++;
i++;
}
nome[j]='{TTEXTO}';
printf(">>>%s", nome);
strcpy(valor[nvalor], nome);
nvalor++;
j=0;
i++;
}
}

void separa_valores(char valores[]) {
int i=0;

printf ("\nvalores: %s \n", valores);
if (valores="<"){
i++;
}
}

void processa_linha(char texto[]){
printf ("\ntexto: %s \n", texto);
}

void mala_direta() {

FILE *dados_carta;
dados_carta=fopen("dados_carta.txt","rt");
if (dados_carta==NULL){
printf ("Arquivo de dados inexistente!!!");
exit(0);
}
if (!feof(dados_carta)){
fgets (linha, 100, dados_carta);
separa_nomes(linha);
}
while (!feof(dados_carta)){
fgets (linha, 100, dados_carta);
separa_valores(linha);
}


FILE *carta1;
carta1=fopen("carta.txt","rt");
if (carta1==NULL){
printf ("Arquivo de dados inexistente!!!");
exit(0);
}

FILE *saida;

saida=fopen("mala_direta.txt","wt");
if (saida==NULL){
printf ("Arquivo de dados inexistente!!!");
exit(0);
}

while (!feof(carta1)){
fgets (linha, 100, carta1);
processa_linha(linha);
fprintf (saida, "%s", linha);
}

}

int main () {
mala_direta();
system ("pause");
}
//


Um abraço,
Marcelo


  


2. problema

Pedro
javamizer

(usa Suse)

Enviado em 07/03/2008 - 21:56h

amigo tenho uma duvida neste post:
http://www.vivaolinux.com.br/comunidades/verTopico.php?codigo=13&codtopico=15884

vc pode me ajudar? ninguem respondeu :(


3. Re: Acessando campos de arquivos txt - C

Geraldo José Ferreira Chagas Júnior
gjr_rj

(usa Debian)

Enviado em 11/03/2008 - 03:27h

vi se post hpedro e vou tentar fazer uns testes em casa


4. Cuidados ao usar fgets

Josimar Zimermann
josimar

(usa Slackware)

Enviado em 11/03/2008 - 19:32h

Olá marceloc! Você está cometendo o mesmo erro que o HPEDRO, e talvez por este motivo esteja encontrando problemas.
Eis o protótipo da função fgets:
char *fgets (char *str, int tamanho,FILE *fp);

A função recebe 3 argumentos: a string a ser lida, o limite máximo de caracteres a
serem lidos e o ponteiro para FILE, que está associado ao arquivo de onde a string será
lida. A função lê a string até que um caracter de nova linha seja lido ou tamanho-1 caracteres tenham sido lidos. Se o caracter de nova linha ('\n') for lido, ele fará parte
da string. A string resultante sempre terminará com '{TEXTO}' (por isto somente <em>tamanho-1</em> caracteres, no máximo, serão lidos).
http://www.mtm.ufsc.br/~azeredo/cursoC/aulas/c970.html#c975

Eu percebi que em algumas partes do seu código você está usando um while(!feof(arquivo))
e dentro do loop você está fazendo o fgets.
Eu compilei o código fonte do HPEDRO e resolvi otimizando o while da seguinte maneira :

Código anterior :

while (!feof(carta1)){
fgets (linha, 100, carta1);
processa_linha(linha);
fprintf (saida, "%s", linha);
}

Código alterado:

while(fgets (linha, 100, carta1)){
processa_linha(linha);
fprintf (saida, "%s", linha);
}

ou seja, ele vai lendo o arquivo e avançando.
Comigo funcionou legal no código do HPEDRO. Talvez seja isso que estaja emperrando.

Valeu!


5. awk

Roberto Júnior
dibetao

(usa Debian)

Enviado em 16/03/2008 - 14:55h

só um dica do mundo linux...
Existe um programa que faz coisas incríveis com arquivos "txt". O 'awk' é uma ferramenta super poderosa. Vale a pena procurar e dar uma lida na internet.

Ex.:
Cortar a 11a coluna do arq1 e colocar no arq2:
awk '{print $11}' arq1.txt > arq2.txt

T+

ps.: Desculpem se fujo um pouco do tópico, mas acho interessante esta ferramenta, já que se trata de dados em arquivos de texto.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts