Fail_J Postado Outubro 29, 2018 Denunciar Share Postado Outubro 29, 2018 (editado) 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 Outubro 29, 2018 por Fail_J Adicionar uma observação Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Visitante Postado Outubro 30, 2018 Denunciar Share Postado Outubro 30, 2018 (editado) 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 Outubro 30, 2018 por Visitante Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Visitante Postado Outubro 30, 2018 Denunciar Share Postado Outubro 30, 2018 (editado) 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 Outubro 30, 2018 por Visitante Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Visitante Postado Outubro 30, 2018 Denunciar Share Postado Outubro 30, 2018 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Fail_J
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_JAdicionar uma observação
Link para o comentário
Compartilhar em outros sites
3 respostass a esta questão
Posts Recomendados
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.