How to do searches in txt Files in C?

0

I am a beginner in programming, and I have a job to deliver to college. In it I have to make customer records using files, and then do a search on the file and print on the screen the data of the registered customer. However, I am not able to perform the search (fourth block of ERROR ):

//estrutura >1<
typedef struct FUNCIONARIO
{
    char  nome_fun[45];
    char tel_fun[15];
    char funcao[45];
    char sal_fun[10];
    char tipo_fun[15];
    int cod_fun;
}FUNCIONARIO;


// Chamada da funcao de cadastro do funcionario >2<
FUNCIONARIO funcionario;
                FILE * arq;
                if((arq = fopen("CadastroFuncionarios.txt", "a"))==NULL) exit(1);
                funcionario = cadastro_funcionario();
                if (fwrite(&funcionario, sizeof(FUNCIONARIO), 1, arq)!=1) break;
                fflush(arq);
                fseek(arq, 0, 0);
                fclose(arq);


// funcao de cadastro do funcionario >3<
FUNCIONARIO cadastro_funcionario()
{
    FUNCIONARIO funcionario;
    FILE *arq;
    arq = fopen("CadastroFuncionarios.txt", "r");
    int cont;
    fseek(arq, 0, 2);
    cont = ftell(arq)/sizeof(FUNCIONARIO);
    fclose(arq);
    // gera cod_funcionario automatico
    system ("cls");
    printf("*********CADASTRO DE FUNCIONARIO**********");
    printf ("\n\nPreencha os dados para cadastro do Funcionario:");
    funcionario.cod_fun = cont;
    fprintf(arq, "%d", funcionario.cod_fun);
    fprintf(arq, "|");
    printf ("\nNOME: ");
    setbuf(stdin, NULL);
    gets (funcionario.nome_fun);
    fputs(funcionario.nome_fun, arq);
    fputs("|",arq);
    printf ("TELEFONE: ");
    setbuf(stdin, NULL);
    gets (funcionario.tel_fun);
    fputs(funcionario.tel_fun, arq);
    fputs("|",arq);
    printf ("FUNCAO: ");
    setbuf(stdin, NULL);
    gets (funcionario.funcao);
    fputs(funcionario.funcao, arq);
    fputs("|",arq);
    printf ("SALARIO: ");
    setbuf(stdin, NULL);
    gets (funcionario.sal_fun);
    fputs(funcionario.sal_fun, arq);
    fputs("|",arq);
    printf ("TIPO (Temporario ou Fixo): ");
    setbuf(stdin, NULL);
    gets (funcionario.tipo_fun);
    fputs(funcionario.tipo_fun, arq);
    fputs("|",arq);
    fputs("\n", arq);
    system("cls");
    rewind(stdin);
    return funcionario;
}

// pesquisa de funcionario - **ERRO** >4<
FUNCIONARIO funcionario; // struct utilizada para o cadastro e impressao na tela
FILE * arq;
if ((arq = fopen("CadastroFuncionarios.txt", "r"))==NULL) exit(1);

char array[1000], nome[30];
int i;
long nrec;
printf ("\n");
printf("**********FUNCIONARIOS CADASTRADOS**********\n\n");
printf ("Informe o nome do Funcionario: ");
setbuf(stdin, NULL);
scanf ("%s", &nome);

fscanf (arq, "%s", array);

nrec = ftell(arq)/sizeof(FUNCIONARIO);
for(i=0; i<nrec; i++)
{

    if(strstr(array, nome)!=NULL)
    {
        pesquisa_funcionario(funcionario); // funcao para impressao na tela
        break;
    }
    else
    {
        printf ("Funcionario nao cadastrado!");
    }

}
fclose(arq);
break;

// funcao para impressao dos dados >5<
void pesquisa_funcionario (FUNCIONARIO funcionario)
{
    printf ("Codigo: %d | ", funcionario.cod_fun);
    printf ("Nome: %s | ", funcionario.nome_fun);
    printf ("Telefone: %s | ", funcionario.tel_fun);
    printf ("Funcao: %s | ", funcionario.funcao);
    printf ("Salario: %s | ", funcionario.sal_fun);
    printf ("Tipo: %s | ", funcionario.tipo_fun);
    printf ("\n");
}

I understand that without posting the complete code, it is not possible to execute, but I think it is too long to put here.

    
asked by anonymous 31.05.2018 / 14:27

1 answer

0

Maybe you wanted to use fwrite and fread to write and retrieve file data, respectively. For example, to write data to the file, which will now be binary, CadastroFuncionarios.dat :

FUNCIONARIO cadastro_funcionario()
{
    FILE *ficheiro;
    FUNCIONARIO funcionario;

    // Executa aqui operações de tela, para obter dados relativos ao funcionário.
    funcionario = preenche_dados();

    if ((ficheiro = fopen("CadastroFuncionarios.dat", "ab") == NULL)
    {
        mostra_erro("Nao foi possivel abrir ficheiro 'CadastroFuncionarios.dat'\n");
        exit(-1);
    }

    if (!fwrite(&funcionario, sizeof(FUNCIONARIO), 1, ficheiro))
    {
        mostra_erro("Nao foi possivel gravar no ficheiro\n");
    }
    fclose(ficheiro);
    ficheiro = NULL;

    return funcionario;
}

The search by employee name can be done as follows,

FUNCIONARIO busca_funcionario(char* nome_desejado)
{
    FILE *ficheiro;
    FUNCIONARIO funcionario;

    if ((ficheiro = fopen("CadastroFuncionarios.dat", "rb") == NULL)
    {
        mostra_erro("Nao foi possivel abrir arquivo 'CadastroFuncionarios.dat'\n");
        exit(-1);
    }

    while (!feof(ficheiro))
    {
        if (!fread(&funcionario, sizeof(FUNCIONARIO), 1, ficheiro))
        {
            mostra_erro("Nao foi possivel ler do ficheiro\n");
            break;
        }

        if (strcmp(funcionario.nome_fun, nome_desejado) == 0)
        {
            printf("Funcionario foi encontrado!\n");
            break;
        }
    }

    fclose(ficheiro);
    ficheiro = NULL;

    return funcionario;
}
    
31.05.2018 / 15:32