Ir ao conteúdo

Posts recomendados

Postado

É o código de desbloqueio de Android. Este código abaixo está funcionando bem.

 

void cadastrarPadrao(){
    FILE *arq;
    if(!(arq = fopen("padrao_desbloqueio.txt", "r"))){
        fclose(arq);
        arq = fopen("padrao_desbloqueio.txt", "w");
        fclose(arq);
        cadastrarPadrao();
    }
    else{
        fseek(arq, 0, SEEK_END);
        if(ftell(arq) != 0) printf("\nO padrão já foi cadastrado!\n");
        else{
            fclose(arq);
            arq = fopen("padrao_desbloqueio.txt", "w");
            int m[9][9];
            int padraoDesbloqueio[41];
            int i, j, k = 0;
            bool valido = true;
            char afirm;
            bool visitados[9];
            for(i = 0; i < 9; i++) for(j = 0; j < 9; j++){
                if(i == 0 && j == 2) m[i][j] = 0;
                else if(i == 2 && j == 0) m[i][j] = 0;
                else if(i == 6 && j == 8) m[i][j] = 0;
                else if(i == 8 && j == 6) m[i][j] = 0;
                else if(i - j == 6) m[i][j] = 0;
                else if(-i + j == 6) m[i][j] = 0;
                else if(i + j == 8) m[i][j] = 0;
                else if(i == j) m[i][j] = 0;
                else m[i][j] = 1;
            }
            for(i = 0; i < 9; i++) visitados[i] = false;
            for(i = 0; i < 41; i++) padraoDesbloqueio[i] = -2;
            do{
                do{
                    printf("\nPonto %d do padrão: ", k);
                    scanf("%d", &padraoDesbloqueio[k]);
                }while(padraoDesbloqueio[k] < 0 || padraoDesbloqueio[k] > 8);
                if(visitados[padraoDesbloqueio[k]]){
                    valido = false;
                    break;
                }
                visitados[padraoDesbloqueio[k]] = true;
                if(k == 0) afirm = 'S';
                else if(m[padraoDesbloqueio[k]][padraoDesbloqueio[k - 1]] == 0){
                    valido = false;
                    break;
                }
                else{
                    if(k == 8) break;
                    do{
                        printf("\nDeseja adicionar outro ponto (S/s/N/n)? ");
                        fflush(stdin);
                        scanf("%c", &afirm);
                    }while(!(afirm == 'S' || afirm == 's' || afirm == 'N' || afirm == 'n'));
                }
                if(afirm == 'S' || afirm == 's') k++;
            }while(afirm == 'S' || afirm == 's');
            if(valido){
                for(i = 0; i < 41; i++){
                    if(padraoDesbloqueio[i] >= 0 && padraoDesbloqueio[i] <= 8){
                        fprintf(arq, "%d\t", padraoDesbloqueio[i]);
                    }
                }
                printf("\nPadrão cadastrado com sucesso!\n");
            }
            else printf("\nPadrão inválido!\n");
            fclose(arq);
        }
    }
}

 

Neste código abaixo, quando digito o um valor diferente do primeiro valor do arquivo, o programa informa padrão incorreto, que é pra informar. Mas quando no ponto 0 do padrão digito o primeiro valor do arquivo e no ponto 1 digito o segundo valor do arquivo, o programa dá padrão incorreto, que não é pra dar, sim é para ir para o ponto 2.

 

void testarPadrao(){
    FILE *arq;
    bool correto = true;
    long pos = 0;
    int ponto, k = 0;
    int padraoDesbloqueio[41];
    if(!(arq = fopen("padrao_desbloqueio.txt", "r"))) printf("\nErro ao tentar abrir arquivo!\n");
    else{
        fseek(arq, 0, SEEK_END);
        if(ftell(arq) == 0) printf("\nO padrão ainda não foi cadastrado!\n");
        else{
            long tam = ftell(arq);
            do{
                printf("\nPonto %d do padrão: ", k);
                scanf("%d", &padraoDesbloqueio[k]);
                fseek(arq, pos, SEEK_SET);
                fscanf(arq, "%d", &ponto);
                if(ponto != padraoDesbloqueio[k]){
                    correto = false;
                    break;
                }
                k++;
                pos = k * (sizeof(int) + sizeof('\t'));
            }while(pos <= tam);
            if(correto) printf("\nPadrão correto!\n");
            else printf("\nPadrão incorreto!\n");
        }
    }
}

 

Postado

Veja se funciona:

void testarPadrao(){
    FILE *arq;
    bool correto = true;
    int ponto, i = 0, k = 0;
    int padraoDesbloqueio[41];
    if(!(arq = fopen("padrao_desbloqueio.txt", "r"))) printf("\nErro ao tentar abrir arquivo!\n");
    else{
        //fseek(arq, 0, SEEK_END);
        //long tam = ftell(arq);
        while(fscanf(arq, "%d", &ponto) == 1) {
            printf("\nPonto %d do padrão: ", k);
            scanf("%d", &padraoDesbloqueio[k]);
            //fseek(arq, i, SEEK_SET);
            //fscanf(arq, "%d", &ponto);
            printf("\n");
            if(ponto != padraoDesbloqueio[k]){
                correto = false;
                break;
            }
            //i = i + k * (sizeof(int) + sizeof('\t'));
            k++;
        }
        if(correto) printf("\nPadrão correto!\n");
        else printf("\nPadrão incorreto!\n");
    }
}

 

Postado

Como antes o problema é o mesmo:

pos = k * (sizeof(int) + sizeof('\t'));

 

sizeof(int) é igual a 4 bytes, mas você não guardou como int no arquivo, mas sim usou fprintf para converter o número inteiro em uma string de caracteres e escrever a string no arquivo de texto.

                    if(padraoDesbloqueio[i] >= 0 && padraoDesbloqueio[i] <= 8){
                        fprintf(arq, "%d\t", padraoDesbloqueio[i]);
                    }

 

Mas como os valores salvos só vão de 0 a 8 então a string sempre terá apenas 1 caractere.

 

Logo, seguindo sua lógica o correto seria:

pos = k * (sizeof(char) + sizeof('\t'));

 

Mas char tem apenas 1 byte, e '\t' também é 1 único caractere logo também ocupa 1 byte, então:

pos = k * (sizeof(char) + sizeof('\t'));
//é igual a:
pos = k * (sizeof(char) + sizeof(char));
//que é igual a:
pos = k * (1 + 1);

//E finalmente obtemos:
pos = k * 2;

 

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!