Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
BarbaNegra27

C Como imprimir uma string que vem antes de outra?

Recommended Posts

oi, então, estou usando a função strstr() para encontrar um cpf dentro de uma string! acontece que eu quero mostrar o que vem antes do cpf o cpf e o que vem depois nessa string, que são as informações do usuário: nome, endereço, data de nascimento entre outros.

alguém sabe como eu faço isso?

 

desde já agradeço!

 

Editado por BarbaNegra27
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@BarbaNegra27     se na string esses dados estiverem separados por espaço assim :

string = " nome cpf endereco data_nascimento outros"

e se você souber a sequencia em que eles estão , então imprima o que está antes ou depois do cpf  letra por letra até encontrar um espaço e nesse ponto você já sabe que depois desse espaço será outro dado .   poste o seu código para vermos como está e em que podemos ajudar .

Compartilhar este post


Link para o post
Compartilhar em outros sites

então, eu até sei a ordem, o problema é que dentro dessa string não esta apenas um os dados de um usuário, estão os dados de todos!

eles estão dentro de um arquivo .txt, ai eu abro o arquivo e uso um fgets() como paramentro de um while até achar o cpf correspondente ao que eu estou procurando. mas o que faço depois que achar? como mostrar os dados?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@BarbaNegra27      a função fgets pega a linha toda e coloca em uma variável,  então nessa variável estará o cpf ,  e creio que os outros dados estarão antes e depois do cpf a um espaço  antes e  depois do cpf,  como postei aí acima .   então você imprime os caracteres da string um por um começando da posição zero até encontrar o caractere nulo " \0 "  e para encontrar o cpf nesse exemplo acima,  ele será o segundo dado da string logo depois do primeiro espaço .

Editado por devair1010

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como está o cadastro do cliente no arquivo de texto? A forma de como você colocou vai deixar mais claro como te ajudar.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

A pergunta do @daniel.oliveira  tem a dica embutida nela.


Para saber onde termina o que vem ANTES do cpf, e onde termina o CPF e começa o que vem depois você tem duas alternativas :

Os dados tem tamanho fixo

os dados tem um delimitador entre um valor e outro.
 

suponha que os dados que estão contidos no arquivo tem nome, time de futebol que ele torce, cpf, data de nascimento, quantidade de vezes que subiu numa árvore sem ajuda de escadas, filme preferido.

 

Exemplo de dados com tamanho fixo (ignore os números. É só uma régua para facilitar a contagem das posições)

                    1                  2                  3                  4                  5                  6               

0123456789012345678901234567890123456789012345678901234567890123456789

BarbaNegra27                 Sao Paulo Futebol Clube410369729151990050112Bambi

 

Onde está o cpf ???


Exemplo com os mesmos dados só que usando  delimitador

|BarbaNegra27|Sao Paulo Futebol Clube|41036972915|19900501|12|Bambi|

 

sacou? então a pergunta é .. como os dados foram gravados no arquivo ? Ou melhor ainda, a pergunta pode ser:

como você acha que os dados devem ser gravados no arquivo de modo a facilitar a leitura depois ? 

Considerando que você que faz o programa que grava e que lê o arquivo, cabe a você definir como eles serão gravados. Esse é o ponto que o Daniel Oliveira levantou. Ou seja, experiente, Daniel sacou logo onde está o X da questão. Parabens Daniel


Se quiser sofisticar .. pode usar XML ou JSON para gravar e ler os dados do arquivo. Mas isso é outro tópico mais avançado.

 

Editado por Boko Moko
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Boko Moko Isso mesmo, sabemos que temos funções em C de leitura de arquivo usam dois tipos de caracteres de demarcação " " e "\n" então a questão está em como você formata seus dados no arquivo TXT. Mais tarde eu procuro exemplos práticos.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@daniel.oliveira @Boko Moko , então os dados estão todos em um unico arquivo .txt dessa maneira:

 

---------------------------
         CADASTRO                           
---------------------------
Nome: Marcos Belino
CPF: 123.456.789-10
Data de Nascimento: 123456
Numero Do Cliente: #8
---------------------------

---------------------------
         CADASTRO                           
---------------------------
Nome: Renan Maia
CPF: 098.765.432.10
Data de Nascimento: 27/05/1998
Numero Do Cliente: #9
---------------------------

---------------------------
         CADASTRO                           
---------------------------
Nome: Marcos Bellino
CPF: 000.000.000-00
Data de Nascimento: 21/02/1945
Numero Do Cliente: #10
---------------------------

 

ai na função de cpf eu preciso achar o que foi igual ao digitado e alem dele os outros dados do cliente que vem apos o cpf

mas não sei como dar um printf somente nos dados daquele cpf entende? tipo como eu faço pra dar um printf no que vem antes do cpf, que no caso aqui seria o nome, e no que esta depois, que seria a data de nascimento e o numero do cliente, sendo que o critério de pesquisa deve ser o cpf.

 

Agora eu coloquei o cpf em primeiro pra facilitar! então a duvida é como mostrar o resto e parar?

 

obs: a ideia inicial era ter gravado cada cadastro em um arquivo .txt separado para facilitar mas não consegui!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@BarbaNegra27    sendo o que está no arquivo igual ao que você postou , seria assim :

        ______
       |
       |        ---------------------------   /* esta linha não serve para nada , será ignorada*/
       |                 CADASTRO             /* esta linha não serve para nada , será ignorada*/              
       |        ---------------------------   /* esta linha não serve para nada , será ignorada*/
       |        Nome: Marcos Belino           /* guarde essa linha em uma   variável var_1 */
bloco -|        CPF: 123.456.789-10           /* guarde essa linha em outra variável var_2 */
       |        Data de Nascimento: 123456    /* guarde essa linha em outra variável var_3 */
       |        Numero Do Cliente: #8         /* guarde essa linha em outra variável var_4 */
       |        ---------------------------   /* esta linha não serve para nada , será ignorada*/
       |
       |______

   então use o comando fgets() que pega o que estiver na linha toda até o final da linha e coloca na string, então para cada bloco você precisa usar o comando fgets() oito vezes, um para cada linha, assim o quarto fgets você coloca em uma variável, que nesse caso é o nome, o quinto fgets é o cpf coloque em outra variável, o mesmo para o sexto e sétimo, e o oitavo apenas para que aponte para o próximo bloco, onde será feito a mesma coisa, então nessas variáveis estará o conteúdo desse bloco, assim você sabe qual variável vem antes e depois do cpf,que nesse caso é var_2,  então para saber se é esse cpf que você está procurando é só comparar com essa variável , e para imprimir o que vem antes do cpf você imprime a variável que foi usada antes do cpf, que é var_1, e depois, a mesma coisa .

Compartilhar este post


Link para o post
Compartilhar em outros sites

existe uma função chamada fgetpos e fsetpos ela te ajuda a ir a uma posição específica em uma arquivo, o correto é você setar uma posição antes de chamar fgets já que ele avança uma linha inteira por vez, depois é só usar fsetpos e você voltará na posição desejada no caso uma linha anterior a do cpf e colocar numa string tudo que vier após o ": " ou '#'.

 

Meu diagrama de exemplo

FILE *txtFile;
fpos_t p; //posição para ser gravada

//Funções para abertura de arquivos...

fgetpos (txtFile, &position); //grava a posição da linha em negrito

 

Nome: Marcos Belino
CPF: 123.456.789-10
Data de Nascimento: 123456
Numero Do Cliente: #8

 

sua_funcao_de_pesquisa() //retorna falso já que não há nenhum CPF

 

fgets pula a linha então estará assim a seu arquivo:

 

Nome: Marcos Belino
CPF: 123.456.789-10
Data de Nascimento: 123456
Numero Do Cliente: #8

 

sua_funcao_de_pesquisa() //retorna verdadeiro se o CPF estiver correto

 

Então você volta para a linha anterior

 

fsetpos (txtFile, &p); 

 

E ficará ssim novamente e aí é só retirar toda a string após ": " ou '#'

 

Nome: Marcos Belino
CPF: 123.456.789-10
Data de Nascimento: 123456
Numero Do Cliente: #8

 

claro que são só dicas, mas esclarece bastante coisa se estiver com dúvidas é só perguntar.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@BarbaNegra27 Esse arquivo txt com os cadastros está sendo gerado pelo seu programa certo? Nesse caso você complicou seu arquivo de cadastros sem necessidade dificultando na hora de recuperar os dados guardados.

 

Você está gerando um arquivo de cadastros como um relatório que pode ser lido e entendido por um usuário qualquer que abra o arquivo diretamente. Mas arquivo dos cadastros é um típico arquivo de banco de dados, e só é necessário guardar os dados propriamente ditos, de modo que o programa consiga interpretar os dados, não é necessário fazer o arquivo ser legível para o usuário quando aberto diretamente num leitor de texto.

 

A função de exibir os dados de forma amigável para o usuário fica a cargo do próprio programa, e no caso poderia exibir os dados na tela ou até gerar relatórios em arquivo que seriam arquivos similares ao que você está fazendo agora, mas não para servir como cadastro do seu programa.

 

 

No caso do exemplo citado, uma maneira melhor de armazenar os cadastros no arquivo seria simplesmente assim:

 

Marcos Belino
123.456.789-10
123456
8
Renan Maia
098.765.432.10
27/05/1998
9
Marcos Bellino
000.000.000-00
21/02/1945
10

E no programa bastaria sempre fazer 4 fgets (ou o comando que for mais conveniente para obter a informação em cada caso) para ler 1 cadastro inteiro.

 

Note que toda vez que fizer a leitura de 1 cadastro você guardaria os 4 dados do cadastro (Nome, CPF, Data de Nascimento, Numero Do Cliente) em variáveis diferentes de uma só vez, assim se o CPF corresponder ao CPF da busca você já tem todos os dados a disposição nas variáveis, e não precisa ficar fazendo malabarismo manipulando strings e arquivos.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Eu acho sua solução muito boa e limpa, é o que eu faria, mas para facilitar o alto consumo de memória a busca só precisaria guardar o nome é CPF em primeira vez e se o CPF for igual aí sim guardar os demais dados do cadastro isso economizaria mais memória, no caso que eu apresentei o programa não gravaria nada e quando achasse o CPF voltaria uma linha e aí ele faria o que bem entender já que estaria no começo do cadastro economizando mais memória. A questão de como formatar os dados é decisão do programador bem como escolher que tipo de dados usar. Para iniciantes eu aconselho trabalhar com arquivo binários, mas isso é outra história.

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, daniel.oliveira disse:

@isrnick Eu acho sua solução muito boa e limpa, é o que eu faria, mas para facilitar o alto consumo de memória a busca só precisaria guardar o nome é CPF em primeira vez e se o CPF for igual aí sim guardar os demais dados do cadastro isso economizaria mais memória, no caso que eu apresentei o programa não gravaria nada e quando achasse o CPF voltaria uma linha e aí ele faria o que bem entender já que estaria no começo do cadastro economizando mais memória. A questão de como formatar os dados é decisão do programador bem como escolher que tipo de dados usar. Para iniciantes eu aconselho trabalhar com arquivo binários, mas isso é outra história.

 

Não há nenhuma economia de memória ao fazer isso, se as variáveis existem o espaço da memória já está reservado, logo o espaço da memória já está ocupado mesmo que nenhum dado tenha sido armazenado nele pelo programa.

 

Além disso, o espaço ocupado por esses dados não representa nada para o computador, são apenas alguns bytes para computadores que tem vários gigabytes de espaço de memória.

 

 

Sim, para um banco de dados desse tipo trabalhar com arquivos em modo binário seria ideal, usando uma struct para lidar com os dados do cadastro no programa, fwrite() para escrever no arquivo e fread() para ler o arquivo. Isso até facilita muito a programação, podendo por exemplo alterar a struct adicionando outro campo de dado (ex: telefone) sem precisar alterar as funções de leitura e escrita de dados nos arquivos, e evita os problemas que aparecem quando se lida com leitura de dados em arquivos em modo texto (como os caracteres '\n' no fim de strings por exemplo).

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Verdade foi um erro meu já que strings em C são ponteiros eu pensei que como eles são alocados dinamicamente faria alguma diferença na memória. Mas fgets() não dá nem a mínima pra isso e pede um vetor de caracteres fixo alocando memória desnecessária.

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






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

×