Ir para conteúdo
Fórum Script Brasil
  • 0

Fail_J

Pergunta

Olá pessoal, acabei de me cadastrar, então desculpe por algum erro..

Tenho de fazer um exercício em C, onde devo fazer uma agenda de dados e salvá-los em disco.

Mas o meu único problema é que não sei como eu faço para conseguir pesquisar por nome as informações em um arquivo salvo em disco, no caso arquivo.txt

Meu programa está assim:

------

#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<time.h>
#include<ctype.h>

struct dados
{
  char nome[40], rg[30], telefone[10], estadocivil[40];      
};

int main()
{
  int menu, quant, quant1;
  char pesquisa[40];
  struct dados func;
  FILE *agenda;
  
  agenda = fopen("agenda.txt", "at"); 
  
  if (agenda == NULL)
  {
  printf("Não foi possível abrir o arquivo");
  return 0; 
  }
 do
 {
  
  printf("----------------------------------------------------------------------\n1-Consultar cliente;\n2-Cadastrar cliente;\n3-SAIR;\n\n");
  scanf("%d", &menu);
  system("cls");
     
  switch (menu)            
  {
     case 1:
        
         printf("Digite o nome de quem deseja consultar: \n");
         scanf("%s", &pesquisa);
        
     break;
        

-----------

Não tenho a mínima ideia de como faço o item 1... os outros eu já me virei.

Obs..: Não faz nem 1 mês direito que  comecei a aprender a programar em C, então desculpem qualquer coisa.

Pesquisei no site sobre a mesma dúvida, mas as respostas que vi não me ajudaram.

Programa: Dev C++

Editado por Fail_J
Adicionar uma observação
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Olá @Fail_J Sinceramente espero não te assustar com um exemplo de ler determinado valor de um arquivo que vou mostrar, mas eu, com exemplos parecidos com esse aprendi a trabalhar com arquivos de maneira bastante eficaz

Você está a menos de um mês estudando C, então a ideia aqui é apenas mostrar uma das formas para ler um arquivo. Se você conseguir entender a lógica do código, vai poder adaptar essa lógica em seu exercício

Claro que estou bem consciente que se trata de um exemplo até bem avançado, mas, na pior das hipóteses, guarde esse código como referência

Vou postar o código e, se tiver alguma dúvida, fique a vontade para perguntar:

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

/* função para limpar a sujeira do buffer */  
void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

int main(void) {

    FILE *fp;
    int i, n;
    float v[10] = { 7.5, 4.5, 8.91, 7, 6, 9.4, 4.1, 5.0, 7.3, 8.3 }, x;
    long nrec, rec, posicao;

    /* Ler os Dados a partir do Teclado */
    //for (i=0; i<10; i++) {
    //    printf("Introd. o %d-esimo No real: ", i + 1);
    //    scanf("%f", &v[i]);
    //    limpa_linha();
    //}

    /* Abrir o Arquivo DADOS.DAT */
    if ((fp = fopen("DADOS.DAT", "w+b")) == NULL) {
        printf("não foi possível criar o arquivo %s\n", "DADOS.DAT");
        exit(1);
    }

    /* Grava as notas no arquivo */
    if (fwrite(v, sizeof(float), 10, fp) != 10)
        fprintf(stderr, "não foram escritos todos os elementos!!!\n");

    printf("\nQual a ordem do Numero que pretende ver 1..10? ");
    scanf("%d", &n);

    /* Mostrar o n-ésimo Número */
    fseek(fp, (long) (n - 1) * sizeof(float), SEEK_SET);
    fread(&x, sizeof(float), 1, fp);

    printf("\nO valor requerido foi %.2f\n", x);

    /* Mostrar o primeiro valor */

    rewind(fp);
    fread(&x, sizeof(float), 1, fp);

    printf("O primeiro valor introduzido foi %.2f\n", x);

    /* Mostrar o Último valor */

    fseek(fp, -(long) sizeof(float), SEEK_END);
    fread(&x, sizeof(float), 1, fp);
    printf("O ultimo valor introduzido foi %.2f\n", x);

    //rewind(fp); // volta para o inicio do arquivo

    fseek(fp, 0, 2);

    nrec = ftell(fp) / sizeof(float);

    printf("Qtde: %ld\n", nrec);

    rec = (long) n;

    if (rec > 0 && rec <= nrec) {
        posicao = (rec - 1) * sizeof(float);
        fseek(fp, posicao, 0);
        fread(&x, sizeof(float), 1, fp);
        printf("Valor requerido: %.2f\n", x);
        fclose(fp);
    } else {
        printf("Registro não existe!\n");
    }

    return 0;
}

Com respeito a leitura de determinado valor de um arquivo também encontrei muita dificuldade principalmente por não encontrar exemplos bons a respeito disso

A conclusão que cheguei quanto a trabalhar com arquivo, como fazer atualização em um arquivo, ler determinado valor ou registro, etc.. é que é preciso trabalhar com estruturas com um tamanho bem definido, que pode ser um struct mesmo. Também é recomendável trabalhar com arquivos binários, para assim fazer uso adequado de função como fseek e ftell, que não são muito eficazes quando se trata de arquivos de texto

Bem.. se quiser assistir um vídeo a respeito do assunto recomendo esse, onde é trabalhado com uma struct:

https://programacaodescomplicada.wordpress.com/2012/12/10/aula-79-arquivos-pt-14-fseek-e-rewind-programacao-descomplicada/

Obs: Não se preocupe se achar o negócio muito complicado, isso é normal mesmo

Editado por Visitante
Link para o comentário
Compartilhar em outros sites

  • 0

Olá novamente. Encontrei um exemplo bem mais simples para te passar:

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

int main(void) {

    char month_name[13][20] = {
        "Invalid month",
        "January", "February", "March", "April",
        "May", "June", "July", "August", "September",
        "October", "November", "December"
    };
    FILE *arq;
    long nrec, rec, posicao;
    int i, mes;
    char month[20];

    if ((arq = fopen("Meses.dat", "w+b")) == NULL) {
        perror("Erro");
        exit(1);
    }

    for (i = 1; i < 13; i++) // Grava os meses no arquivo, exceto o de índice 0
        fwrite(month_name[i], sizeof(month_name[0]), 1, arq);

    nrec = ftell(arq) / sizeof(month_name[0]);

    printf("Quantidade: %ld\n", nrec);

    printf("\nSelecione o mes que deseja (1 a 12): ");
    scanf("%d", &mes);

    posicao = (long) (mes - 1) * sizeof(month_name[0]); // mes - 1

    fseek(arq, posicao, 0);
    fread(month, sizeof(month_name[0]), 1, arq);

    fclose(arq);

    printf("Mes escolhido: %s\n", month);

    return 0;
}

Não se preocupe se achar muito complicado esse negócio. Para quem está a menos de um mês estudando C é mais que normal que isso aconteça

OBS: Quem sabe aparece uma resposta de algum colega aqui do fórum com uma maneira mais simples de resolver esse seu exercício 

Editado por Visitante
Link para o comentário
Compartilhar em outros sites

  • 0

Olá @Fail_J Tem maneira bem mais simples para resolver esse seu exercício

vou passar uma parte do código que tenho aqui que, se entender, vai saber adaptar em no exercício:

struct cadastro
{
    char name[50];
    char telefone[50];
} contato[50];

////////////////////////////////////////////////////

i = 0;
encontrado = 0;
while (fscanf(arq, " %[^\n] %s ", contato[i].name, contato[i].telefone) != EOF) { // lê o nome e o telefone do arquivo
    if (!strcmp(nome, contato[i].name)) { // compara com o nome informado
        strcpy(nome_contato, contato[i].name); // se encontrado copia para outras strings o nome e telefone
        strcpy(fone, contato[i].telefone);
        encontrado = 1;
        break;
    }
    i++;
}

if (encontrado) {
    printf("\n\tResultado da consulta\n\n");
    printf("Nome: %s\n", nome_contato);
    printf("Telefone: %s\n\n", fone);
} else
    printf("\nContato inexistente");

fclose(arq);

Qualquer dúvida é só perguntar, ok?

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...