Ir ao conteúdo
  • Cadastre-se

C Exercicios - Manipulação de arquivo


elyastrid

Posts recomendados

Olá, sou iniciante em C  e estou com dúvidas na resolução desse exercício. Segue enunciado, meus código e minhas dúvidas abaixo.

1) Faça um programa que leia o nome e telefone de 10 clientes e armazene as informações fornecidas dentro de um arquivo de texto. Após o armazenamento, o seu programa deverá ser capaz de pesquisar um cliente sempre que necessário.

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

struct dados {
	char nome [40];
	int telefone;
};

int main () {
	int i;
	struct dados clientes[4];
    FILE *arquivo;
    
    arquivo = fopen ("info.txt","w");
    
    if (arquivo==NULL) {
    	printf ("Erro na abertura do arquivo!"); }
// armazenar os dados //
for (i=0;i<3;i++) {
	printf ("Digite o seu nome:");
	scanf ("%s",&clientes[i].nome);
	fprintf (arquivo, "%s \n", clientes[i].nome);
	printf ("Digite o seu telefone:");
	scanf ("%d", &clientes[i].telefone);
	fprintf (arquivo, "%d \n", clientes[i].telefone);
}
fclose(arquivo);

system ("pause");
return 0;
}

Em relação ao primeiro, gostaria de saber como faço para que o programa pesquise um cliente sempre que necessário ?

 

Link para o comentário
Compartilhar em outros sites

scanf ("%s",&clientes[i].nome);

Acredito que o certo seria, em termos do padrão:

scanf ("%s",clientes[i].nome);

você poderia desenvolver um programa para fazer o inverso, ao invés de salvar, ler os dados armazenados em um arquivo e transferi-los para um array na memória (ex. clientes). Após ler os dados do arquivos, você deve solicitar ao usuário o nome a ser pesquisado e depois varrer todos os endereços armazenados comparando os nomes. Veja o exemplo abaixo (não testei, pode ter alguns erro sintaxe/lógica):

#include <string.h>
struct dados clientes[10];
...
//ler arquivo .txt e amarzenar dados no array clientes
...
//pesquisa
do
{
	char cliente[40];
    printf ("Entre o nome do cliente para pesquisar:"); 
	scanf ("%s", cliente);
	for (int i = 0; i < 10; i++)	{
      if !strcmp(cliente, clientes[i].nome)
	  {
        printf ("Telefone: %d", clientes[i].telefone);
        break;
      }
    }
                          
                          
	
} while (strlen(cliente) > 0);

O programa para quando você digitar um nome em branco.

Link para o comentário
Compartilhar em outros sites

@elyastrid Olá. Recomendo fazer a leitura do arquivo onde os nomes e telefones estão sendo gravados

Seria algo assim:

struct dados cliente; // para ler do arquivo
arquivo = fopen("info.txt", "r");

printf("Digite o nome que deseja pesquisar: ");
scanf(" %39[^\n]", nome); // para ler o nome e sobrenome
limpa_linha();

while (fscanf(arquivo, " %[^\n] %d", cliente.nome, &cliente.telefone) != EOF) {
    if (!strcmp(nome, cliente.nome)) {
        printf("Nome: %s\n", cliente.nome);
        printf("Telefone: %d\n", cliente.telefone);
    }
}

// para o Linux
printf("Pressione qualquer tecla para continuar...");
scanf("%*c");

Se tiver erro no código desculpa. Andei um tempinho sem programar em C rs... 

 

Obs: Como a @Flávio Pedroza comentou, é preciso incluir o arquivo de cabeçalho <string.h> para a função strcmp()  

 

Recomendo usar uma função para limpar a sujeira do buffer para ler 10 nomes e 10 telefones:

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

Tal como está no código postado acima 

Link para o comentário
Compartilhar em outros sites

@r_Tray

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
	
struct dados {
	char nome [40];
	int telefone;
};
int op;
int i;

int main (){
	char pesquisar[40];
	struct dados clientes[4];
    FILE *arquivo;
    
    arquivo = fopen ("info.txt","w");
    
    if (arquivo==NULL) {
    	printf ("Erro na abertura do arquivo!"); }
// armazenar os dados //
for (i=0;i<3;i++) {
	printf ("Digite o seu nome:");
	scanf ("%s",&clientes[i].nome);
	fprintf (arquivo, "Nome: %s \n", clientes[i].nome);
	printf ("Digite o seu telefone:");
	scanf ("%d", &clientes[i].telefone);
	fprintf (arquivo, "Telefone: %d \n", clientes[i].telefone);
	fprintf (arquivo, "----------------------------------------- \n");
}
fclose(arquivo);
// pesquisar //
char nomepesquisa[40];
int telefonepesquisa;
do {
	arquivo= fopen ("info.txt", "r");
	printf ("\n Digite 1 para pesquisar por Nome ou 2 p/ pesquisar por telefone:");
	scanf ("%d", &op);
	switch (op) {
		case 1:
			printf ("\n Digite o nome:");
			scanf ("%s", &nomepesquisa);
			for (i=0;i<3;i++) {
				if (clientes[i].nome == nomepesquisa) {
					printf ("\n Nome: %s \n Telefone: %d",clientes[i].nome, clientes[i].telefone);
				}
			}
		    break;
		case 2:
			printf ("\n Digite o telefone:");
			scanf("%d", &telefonepesquisa);
			for (i=0;i<3;i++) {
				if (clientes[i].telefone == telefonepesquisa) {
					printf ("\n Telefone: %d Nome: %s", clientes[i].telefone, clientes[i].nome);
				}
			}
		break;
		default:
			printf ("\n Opcao invalida:");
			break;
}
printf ("\n Digite 1 para continuar pesquisando:");
scanf ("%d", &op);
} while (op==1);
			
fclose(arquivo);		
system ("pause");
return 0;
}

Onde eu deveria inserir esse void para limpar as linhas ?

E não consigo executar quando pesquiso pelo nome, apenas pelo telefone...

Link para o comentário
Compartilhar em outros sites

@elyastrid Olá. Quanto a função limpa_linha você pode inserir logo abaixo da sua struct, dessa forma:

struct dados {
    char nome [40];
    int telefone;
};

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

E aí chame essa função após cada scanf. Segue um exemplo:

 

printf ("Digite o seu nome:");
scanf ("%s", clientes[i].nome); // para string e ponteiros não é preciso o uso do & comercial no scanf
limpa_linha(); // aqui eu chamo a função que limpa a sujeira do buffer

fprintf (arquivo, "Nome: %s \n", clientes[i].nome);

printf ("Digite o seu telefone:");
scanf ("%d", &clientes[i].telefone);
limpa_linha();

fprintf (arquivo, "Telefone: %d \n", clientes[i].telefone);
fprintf (arquivo, "----------------------------------------- \n");

Mas é importante entender porque usar essa função e o que é sujeira no buffer

Segue um vídeo explicando sobre o assunto:

https://programacaodescomplicada.wordpress.com/2013/01/08/aula-81-limpar-o-buffer/

Recomendo fortemente assistir esse vídeo

Só que no vídeo o professor sugere o uso de outra função. Mas essa função que ele sugere não é recomendável usar

 

Quanto a comparar strings em C o @Flávio Pedroza explicou acima

 

Outra dica de como você poderia usar o do/while:

do {
    printf ("\n Digite 1 para pesquisar por Nome, 2 p/ pesquisar por telefone ou 3 p/ sair: ");
    scanf ("%d", &op);
    limpa_linha();

    switch (op) {
    case 1:
        printf ("\n Digite o nome:");
        scanf ("%s", nomepesquisa);
        limpa_linha();

        for (i = 0; i < 3; i++) {
            if (!strcmp(clientes[i].nome, nomepesquisa)) { // aqui para comparar strings em C use a função strcmp
                printf ("\n Nome: %s \n Telefone: %d",clientes[i].nome, clientes[i].telefone);
            }
        }
        break;
    case 2:
        printf ("\n Digite o telefone:");
        scanf("%d", &telefonepesquisa);
        limpa_linha();
        
        for (i = 0; i < 3; i++) {
            if (clientes[i].telefone == telefonepesquisa) {
                printf ("\n Telefone: %d Nome: %s", clientes[i].telefone, clientes[i].nome);
            }
        }
        break;
    case 3:
        // sair
        break;
    default:
        printf ("\n Opcao invalida:");
        break;
    }

} while (op != 3);

 

Qualquer dúvida é só perguntar, ok? :)

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!