Ir ao conteúdo
  • Cadastre-se

C Problema em ler string de um arquivo txt


elyastrid

Posts recomendados

Olá, sou iniciante em C e estou com problemas no meu código. Na parte de pesquisar os clientes, ele não me retorna nada do arquivo. Segue código abaixo.

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

struct questionario {
	char nome [40];
	char sexo [40];
	int idade;
	float renda;
	char fumante [40];
	char esportes [40];
	char atividade [40];
};
int op;
int i;
int main () {
	int i;
	struct questionario respostas[4];
	FILE *arquivo;
	
// MENU DE OPÇÕES //
printf ("Digite 1 para cadastrar uma nova entrevista : \n");
printf ("Digite 2 para pesquisar uma entrevista : \n");
printf ("Digite 3 para gerar estatisticas sobre as entrevistas :\n ");
scanf ("%d", &op);
// CADASTRAR NOVA ENTREVISTA //
switch (op) {
		case 1: 
		arquivo= fopen ("resposta.txt", "a");
	
	if (arquivo == NULL) {
		printf ("Erro na abertura do arquivo!"); 
	}
do {	
{
	
	printf ("Digite o seu nome:");
	scanf ("%s", &respostas[i].nome);
	fprintf (arquivo, "Nome: %s \n",respostas[i].nome);
	printf ("Digite o seu sexo - F p/Feminino, M p/ Masculino e O p/ Outro: ");
	scanf ("%s", &respostas[i].sexo);
	fprintf (arquivo,"Sexo: %s \n", respostas[i].sexo);
	printf ("Digite a sua idade:");
	scanf ("%d", &respostas[i].idade);
	fprintf (arquivo, "Idade: %d \n", respostas[i].idade);
	printf ("Digite a sua renda:");
	scanf ("%f", &respostas[i].renda);
	fprintf (arquivo, "Renda: %f \n", respostas[i].renda);
	printf ("Eh fumante ? - S p/ Sim e N p/ Nao: ");
	scanf ("%s", &respostas[i].fumante);
	fprintf (arquivo, "Eh fumante?: %s \n", respostas[i].fumante);
	printf ("Gosta de esportes? - S p/ Sim e N p/ Nao:");
	scanf ("%s", &respostas[i].esportes);
	fprintf (arquivo, "Gosta de esportes?: %s \n", respostas[i].esportes);
	printf ("Pratica atividade fisica ? - S p/ Sim e N p/ Nao: ");
	scanf ("%s", &respostas[i].atividade);
	fprintf (arquivo, "Pratica atividade fisica?: %s \n", respostas[i].atividade);
	fprintf (arquivo,"----------------------------------------------------------------------- \n");
}
fclose (arquivo);
printf ("\n Digite 1 para continuar cadastrando:");
scanf ("%d", &op);
} while (op==1);
// PESQUISAR UMA ENTREVISTA //
char nomepesquisa [40];
    case 2: 
    arquivo= fopen ("info.txt", "r");
            printf ("\n Digite o nome:");
			scanf ("%s ", &nomepesquisa);
			 for(i=0;i<4;i++) {
        if (!strcmp(nomepesquisa,respostas[i].nome))
        {
            printf ("\n Nome: %s",respostas[i].nome);
            printf ("\n Sexo: %s", respostas[i].sexo);
            printf ("\n Idade: %d", respostas[i].idade);
            printf ("\n Renda: %f", respostas[i].renda);
            printf ("\n Eh fumante?: %s",respostas[i].fumante);
            printf("\n Gosta de esportes?: %s", respostas[i].esportes);
            printf ("\n Pratica atividade fisica?: %s", respostas[i].atividade);
            
        
        }        
}
     break;

system ("pause");
return 0;

}
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@elyastrid           você precisa de hum  while para procurar em todo o arquivo testando se cada palavra lida do arquivo é igual a palavra digitada ,   então para pegar apenas as palavras que interessam , precisa organizar o código para isso , pois na hora que você está salvando os dados você está incluindo mais algumas palavras no arquivo então na hora de ler precisa eliminar essas palavras à mais e que não representam os dados informados .   por isso trabalhar com arquivos é complicado , seria melhor pegar os dados do arquivo e colocar na struct já no inicio do código e depois na hora de pesquisar e incluir ou excluir , etc . . .  se tornaria bem mais fácil .   pois trabalharia com a struct .

 

while(fscanf(arquivo,"%s",respostas[i].nome)!= EOF){
    if(strcmp(nomepesquisa,respostas[i].nome)==0)
                  .
         o que fazer
                  .
}

 

Link para o comentário
Compartilhar em outros sites

15 minutos atrás, devair1010 disse:

seria melhor pegar os dados do arquivo e colocar na struct já no inicio do código e depois na hora de pesquisar e incluir ou excluir , etc . . .  se tornaria bem mais fácil .

Como eu colocaria esses dados na struct no inicio do código ? 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@elyastrid       do jeito que seu código está ,  você precisa ir lendo no arquivo letra por letra , e para isso você usa o comando fgetc   ,    e quando encontrar o caractere    "  :  "     Dois pontos  então aí será onde começa o dado referente a essa variável da struct , então você lê o dado usando fscanf , já incluindo na struct , e fazendo assim para cada variável da struct , até que e fgetc encontre o final do arquivo  "  EOF  "   .

 

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
struct questionario {
    char  nome[     40];
	char  sexo[     40];
	int   idade        ;
	float renda        ;
	char  fumante[  40];
	char  esportes[ 40];
	char  atividade[40];
};
struct questionario respostas[4];
FILE *arquivo;
int cont;/* conta quantidade de cadastro */
int pegar();
void imprimir();
int cadastrar();
int main () {
	char estatistica [40];
	int opc;
	arquivo= fopen ("resposta.txt", "r");
	if(arquivo == NULL)
        arquivo = fopen("resposta.txt","w");
	pegar();
	imprimir();
	do{
	    printf("1 - Cadastrar\n");
	    printf("2 - Pesquisar\n");
	    printf("3 - Gerrar Estatisticas\n");
	    printf("4 - Sair\n\nOpcao : ");
	    scanf("%d",&opc);
	    switch(opc){
        case 1:
            cadastrar();
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            break;
        default :
            printf("Opcao Invalida !\n");
	    }
	}while(opc != 4);

    system ("pause");
    return 0;
}
int pegar(){
    int i=0,j=0;
    char a;
    while((a=fgetc(arquivo))!= EOF){
        if( a == ':' ){
            if(j==0)fscanf(arquivo,"%s",respostas[i].nome);
            else if(j==1)fscanf(arquivo,"%s",&respostas[i].sexo);
            else if(j==2)fscanf(arquivo,"%d",&respostas[i].idade);
            else if(j==3)fscanf(arquivo,"%f",&respostas[i].renda);
            else if(j==4)fscanf(arquivo,"%s", respostas[i].fumante);
            else if(j==5)fscanf(arquivo,"%s", respostas[i].esportes);
            else if(j==6)fscanf(arquivo,"%s", respostas[i].atividade);
            j++;
            if(j==7){i++;j=0;}
        }
    }
    cont = i;
    printf("    Leu todo arquivo !\n\n");
}
int cadastrar(){
    int i;
    for(i=0; i<1; i++){
        printf("Digite o seu nome ------------------- : "                            );
        scanf("%s",&respostas[i].nome);
        fprintf(arquivo,"Nome ----------------------- : %s \n",respostas[i].nome     );
        printf("    O sexo\n- F = Feminino\n- M = Masculino\n- O = Outro : ");
        scanf("%s",&respostas[i].sexo);
        fprintf(arquivo,"Sexo ----------------------- : %s \n",respostas[i].sexo     );
        printf("A idade ----------------------------- : ");
        scanf("%d",&respostas[i].idade);
        fprintf(arquivo,"Idade ---------------------- : %d \n",respostas[i].idade    );
        printf("A renda ----------------------------- : ");
        scanf("%f",&respostas[i].renda);
        fprintf(arquivo,"Renda ---------------------- : R# %.2f\n",respostas[i].renda);
        printf("    Eh fumante ?\n- S = Sim\n- N = Nao : ");
        scanf("%s",&respostas[i].fumante);
        fprintf(arquivo,"Eh fumante ? --------------- : %s \n",respostas[i].fumante  );
        printf("    Gosta de esportes ?\n- S = Sim\n- N = Nao :");
        scanf("%s",&respostas[i].esportes);
        fprintf(arquivo,"Gosta de esportes ? -------- : %s \n",respostas[i].esportes );
        printf("    Pratica atividade fisica ?\n- S = Sim\n- N = Nao : ");
        scanf("%s",&respostas[i].atividade);
        fprintf(arquivo,"Pratica atividade fisica ? - : %s \n",respostas[i].atividade);
        fprintf(arquivo,"---------------------------------------------------\n"      );
        cont++;
        if(cont > 60){
            printf("Só Pode Cadastrar Apenas 60 Pessoas !\n\n");
            Sleep(3000);
            return 0;
        }
	}
}
void imprimir(){
    int j;
    for(j=0; j<cont; j++){
    printf("nome ---------------- : %s\n"  ,respostas[j].nome     );
    printf("sexo ---------------- : %s\n"  ,respostas[j].sexo     );
    printf("idade --------------- : %d\n"  ,respostas[j].idade    );
    printf("renda --------------- : %.2f\n",respostas[j].renda    );
    printf("fumante ------------- : %s\n"  ,respostas[j].fumante  );
    printf("esporete ------------ : %s\n"  ,respostas[j].esportes );
    printf("atividade ----------- : %s\n\n",respostas[j].atividade);
    printf("----------------------------------\n");
    }
    printf("     Tecle !\n");
    getch();
    printf("\n\n");
}

 

 

 

Link para o comentário
Compartilhar em outros sites

@elyastrid     você pode usar o comando fscanf  , mas ele só pega uma palavra ou número de cada vez que esteja junto e para de ler quando encontra um espaço em branco , continuando no próximo loop até encontrar o EOF .

 

int i=0;
while(fscanf(arquivo,"%s",respostas[i].nome)!= EOF){
    printf("Leu Essa Palavra -> %s\n",respostas[i].nome);
    i++;
}
printf("Leu e Imprimiu Todo Arquivo !\n\n");

 

 

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!