Ir ao conteúdo
  • Cadastre-se
Bruno Eduardo_731343

C RESOLVIDO Ler um arquivo e guardar parte dele em variáveis

Recommended Posts

Gente,tô tendo uma dificuldade aqui pra ler um arquivo txt e guardar trechos desses arquivo em variáveis:

 

segue o arquivo que estou chamando de lista.txt:

 

BEGIN:VCARD
VERSION:3.0
FN:Bruno Eduardo
N:;;;;
EMAIL;TYPE=INTERNET;TYPE=HOME:bruno.edu.ks@hotmail.com
TEL;TYPE=CELL:+55(98)981060705
END:VCARD
 
Meu desejo é pegar o nome(Bruno Eduardo),Email e Número e guardar em três strings.
 
Segue o código que tenho até agora(pouca coisa,o máximo que consegui fazer foi salvar apenas o nome Eduardo;
#include <stdio.h>
int main () {
    char var;
    char nome[50];
    char buff[50];
    char num[15];
    char email[50];
    
    FILE *arquivo = fopen("lista.vcf","r");
    fscanf(arquivo,"%s",buff);    
    fscanf(arquivo,"%s",buff);    
    fscanf(arquivo,"%s %s",buff,nome);    
    printf("%s %s %s",nome,num,email);    
    fclose(arquivo);

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função fscanf lê os characters até achar um espaço em branco ou quebra de linha (ou fim do arquivo).

A função fgets lê os characters até achar uma quebra de linha ou fim do arquivo. Então talvez pro seu código seja melhor usar o fgets() já que os nomes têm espaços em branco.

 

Se preferir usar o fscanf mesmo, você pode tentar manipular a máscara dele pra pegar o que quer... por exemplo:

fscanf(arquivo,"%*4c%s",buff); ---> isso aqui vai ignorar o "FN:" e pegar apenas "Bruno" na terceira linha. Depois é só usar outro fscanf() pra pegar "Eduardo".

 

Mas acho que dá mais trabalho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função fscanf lê os characters até achar um espaço em branco ou quebra de linha (ou fim do arquivo).

A função fgets lê os characters até achar uma quebra de linha ou fim do arquivo. Então talvez pro seu código seja melhor usar o fgets() já que os nomes têm espaços em branco.

 

Se preferir usar o fscanf mesmo, você pode tentar manipular a máscara dele pra pegar o que quer... por exemplo:

fscanf(arquivo,"%*4c%s",buff); ---> isso aqui vai ignorar o "FN:" e pegar apenas "Bruno" na terceira linha. Depois é só usar outro fscanf() pra pegar "Eduardo".

 

Mas acho que dá mais trabalho.

E como faço pra mascarar o que é "lixo" pra mim com o fgets? Por que aqui ele pega a linha toda.  Manipulando as strings da pra usar dessa maneira que você exemplificou com o fscanf. Mas nunca vi algo parecido com isso (%*4c),onde encontro algo explicando melhor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com o fgets você não usa máscaras... qualquer processamento é feito depois, na string capturada por ele.

Por exemplo, se o seu fgets pegou a string "FN:Bruno Eduardo" então basta copiar os caracteres string[3] até string[15] pra uma substring.

 

Você pode copiar manualmente (faz um FOR copiando os characters) ou então usa a função memcpy() ou strncpy().

Ex:

#include <stdio.h>
#include <string.h>
int main() {
    char string1[20] = { "Ola mundo\0" };
    char string2[10];
    memcpy( string2, string1+4, 6 );   
    printf("%s\n", string2);
    return 0;
}

Edit:

Sobre o "%*4c", o asterisco tá dizendo pra ignorar o que vier a seguir. O 4c significa "4 caracteres".

Então "%*4c%s" --> Ignore os 4 caracteres a seguir e guarde o restante numa string.

O site que eu uso pra pegar essas referências é http://www.cplusplus.com/reference/cstdio/scanf/

Mas eles não explicam muito bem lá... pra ser sincero são poucos livros/sites que explicam esse tipo de coisa. O jeito é sair testando mesmo.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
 

Com o fgets você não usa máscaras... qualquer processamento é feito depois, na string capturada por ele.

Por exemplo, se o seu fgets pegou a string "FN:Bruno Eduardo" então basta copiar os caracteres string[3] até string[15] pra uma substring.

 

Você pode copiar manualmente (faz um FOR copiando os characters) ou então usa a função memcpy() ou strncpy().

Ex:


#include <stdio.h>
#include <string.h>
int main() {
    char string1[20] = { "Ola mundo\0" };
    char string2[10];
    
    memcpy(string2, string1+4, 6);
    printf("%s\n", string2);    return 0;
}

Edit:

Sobre o "%*4c", o asterisco tá dizendo pra ignorar o que vier a seguir. O 4c significa "4 caracteres".

Então "%*4c%s" --> Ignore os 4 caracteres a seguir e guarde o restante numa string.

O site que eu uso pra pegar essas referências é http://www.cplusplus.com/reference/cstdio/scanf/

Mas eles não explicam muito bem lá... pra ser sincero são poucos livros/sites que explicam esse tipo de coisa. O jeito é sair testando mesmo.

 

Resolvido! Muito obrigado,dontpanic.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×