Ir ao conteúdo
  • Cadastre-se

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


Ir à solução Resolvido por dontpanic,

Posts recomendados

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:[email protected]
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);

 

 

Link para o comentário
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.

Link para o comentário
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?

Link para o comentário
Compartilhar em outros sites

  • Solução

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
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...