How to compare string in text file with user imput and do validation?

-1

At the end of this code, I'm trying to read the names of some countries and compare them with user input, but I'm not getting results. He keeps repeating. If it does, the program has to follow the flow normally.

void cadastrarDadosAvioes(Aviao *aviao, int *contaAviao, FILE *arquivo, int *baseInicial){
    int opcao=0, i, j, flag=1;
    char nomeAux[MAX], *result;
    strcpy(nomeAux, "");

    FILE *paises;

    //acrescenta dodos ao final ou faz leitura/escrita de arquivo
    arquivo = fopen("cadastroAvioes.txt", "ab");

    //arquivo dos paises

    paises = fopen("paises.txt", "r");

    if(arquivo=NULL){
        printf("\nNao foi possivel abrir o arquivo!\n");
        exit(EXIT_FAILURE);
    }else{    
        do{

            if(*contaAviao==10){
                *baseInicial = (*contaAviao)*2;
                aviao = (Aviao*)realloc(aviao, (*baseInicial)*sizeof(Aviao));
            }

            for(i=0;i<*baseInicial;i++){
                if(stricmp((aviao+i)->codigoIdentificacao, "")==0){
                    do{
                        strcpy((aviao+i)->codigoIdentificacao, leValidaCodigoAviao("DIGITE O CODIGO DO AVIAO:", "\nCODIGO DIGITADO INVALIDO!\n"));
                        for(j=0;j<*baseInicial;j++){
                            if(stricmp((aviao+i)->codigoIdentificacao, (aviao+j)->codigoIdentificacao)==0&&i!=j){
                                flag=0;
                                printf("\nCodigo ja existe!\n");
                            }else{
                                flag=1;
                            }
                        }

                    }while(!flag);

                    do{
                        strcpy((aviao+i)->modeloAviao, leValidaTexto("DIGITE O MODELO DO AVIAO:", "\nMODELO NAO PODE SER VAZIO!\n"));
                        for(j=0;j<*baseInicial;j++){
                            if(stricmp((aviao+i)->modeloAviao, (aviao+j)->modeloAviao)==0&&i!=j){
                                flag=0;
                                printf("\nEsse modelo já existe!\n");
                            }else{
                                flag=1;
                            }
                        }

                    }while(!flag);

                    leValidaCapacidade("INFORME A CAPACIDADE DO AVIAO:", "\nCAPACIDADE INVALIDA!\n", &(aviao+i)->capacidade);

                    do{
                        strcpy((aviao+i)->nomeCliente, leValidaTexto("DIGITE O NOME DO CLIENTE:", "\nNOME INVALIDO!\n"));
                        for(j=0;j<*baseInicial;j++){
                            if(stricmp((aviao+i)->nomeCliente, (aviao+j)->nomeCliente)==0&&i!=j){
                                flag=0;
                                printf("\nEsse nome já existe!\n");
                            }else{
                                flag=1;
                            }
                        }

                    }while(!flag);
                    /*
                    strcpy((aviao+i)->nomePais, leValidaTexto("DIGITE O NOME DO PAIS:", "\nPAIS INVALIDO!\n"));
                    paises = fopen("paises.txt", "r");
                    if(paises=NULL){
                        printf("\nArquivo não existe!\n");
                        exit(EXIT_FAILURE);
                    }else{
                        //Aqui estou tentando ler o arquio paises.txt

                        while(fscanf(arquivo, "%s", &nomeAux)){
                            printf("%s\n", nomeAux);
                        }
                    }
                    */

                    do{
                        strcpy((aviao+i)->nomePais, leValidaTexto("DIGITE O NOME DO PAIS:", "\nPAIS INVALIDO!\n"));
                        if(!paises){
                            printf("\nArquivo não existe!\n");
                            exit(EXIT_FAILURE);
                        }else{
                            while(fscanf(paises, "%s", &nomeAux)!=EOF){
                                if(strcmp((aviao+i)->nomePais, nomeAux)==0){
                                    flag=1;
                                    break;
                                }else{
                                    flag=0;
                                    break;
                                }
                            }
                        }

                    }while(!flag);

                    break;
                }
            }

            //atualiza contador
            *contaAviao+=1;

            printf("(1)- CADASTRAR OUTRO AVIAO\n");
            printf("(2)- RETORNAR AO MENU\n\n");
            scanf("%d", &opcao);

            if(opcao == 2){
                getch();
                return;
            }

        }while(opcao==1&&(*contaAviao<*baseInicial));
        fclose(arquivo);
    }   
}
    
asked by anonymous 13.11.2018 / 20:53

1 answer

1

I think you're referring to it here:

while(fscanf(paises, "%s", &nomeAux)!=EOF){
    if(strcmp((aviao+i)->nomePais, nomeAux)==0){
        flag=1;
        break;
    }else{
        flag=0;
        break;
    }
}

You have not described the file format. But I believe it's a country name by line. In this case best use the fgets() that reads line the line:

while (fgets(nomeAux, MAX, paises)) {

See that fgets() can include the end-of-line character ( \n ) in the returned string. You will have to search for the character and remove it.

The% reads% to the first whitespace, then a line with fscanf() returns twice: one for Estados Unidos and one for Estados .

    
13.11.2018 / 21:21