6
respostas

Erro ao ler o .txt para adicionar nova palavra

Após o programa rodar o jogo sem problema, usando de palavra aleatória do arquivo .txt, ele da erro quando tento adicionar uma nova palavra, ele pergunta qual a palavra nova e assim que é digitada aparece que não houve comunicação com o banco de dados. Fiz uma tentativa usando os arquivos disponiveis do curso com o programa completo até essa aula e deu o mesmo problema.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include "forca.h"

    char palavrasecreta[20];
    char chutes[26];
    int chutesdados = 0;

void abertura() {                         //Não gera retorno para o main
     printf("=====================\n");
    printf("||  Jogo de Forca  ||\n");
    printf("=====================\n\n");
}

void chuta(){

        char chute;

        scanf (" %c", &chute);

        chutes[(chutesdados)] = chute;
        (chutesdados)++;

}

int jachutou(char letra){    //Gera um retorno para o main como uma variavel

        int achou = 0;

        for(int j=0; j< chutesdados;j++){ 

            if (chutes[j]==letra) {

                achou = 1;
                break;
            }
        }
        return achou;
}

void desenhaforca(){

    printf("Você já deu %d chutes\n", chutesdados);

    for(int i = 0; i < strlen (palavrasecreta); i++){ 

            int achou = jachutou(palavrasecreta[i]);


            if(achou){
                printf("%c ", palavrasecreta[i]);

            }
            else{
                printf ("_ ");
            }
        }
        printf ("\n");
}

void adicionapalavra(){

    FILE *f;
    char quer;
    printf("Voce deseja adicionar uma nova palavra ao jogo (S/N)\n");
    scanf(" %c", &quer);

    if(quer=='S'){


        char novapalavra[20];
        printf("Qual a nova palavra?(digite em letras maiusculas)");
        scanf("%s", novapalavra);



        f = fopen("palavras.txt", "r+");

            if(f == 0){
                printf("Desculpa, banco de dados indisponivel\n\n");
                exit(1);
            }


            int qtd;
            fscanf(f, "%d", &qtd);
            qtd++;

            fseek(f, 0, SEEK_SET);
            fprintf(f, "%d", qtd);

            fseek(f, 0, SEEK_END);

        fprintf(f, "\n %s", novapalavra);


    }
fclose(f);
}

void escolhepalavra(){

    FILE *f;

    f = fopen("palavras.txt", "r");

    if(f == 0) {
        printf("Desculpa, banco de dados indisponivel\n\n");
        exit(1);
    }

    int qtddepalavras;
    fscanf(f, "%d", &qtddepalavras);

    srand(time(0));
    int randomico = rand() % qtddepalavras;

    for(int i =0; i<=randomico;i++){
        fscanf(f, "%s", palavrasecreta);
    }

        fclose(f);

}

int acertou(){
        for(int i=0;i<strlen(palavrasecreta);i++){
            if(!jachutou(palavrasecreta[i])){
                return 0;
            }
        }

        return 1;
}

int enforcou() {

    int erros=0;
    for(int i = 0; i<chutesdados;i++){
        int existe=0;

        for(int j = 0; j<strlen(palavrasecreta); j++){
            if(chutes[i]==palavrasecreta[j]){

                existe=1;
                break;
            }
        }

        if(!existe) erros++;
    }

    return erros >= 6;
}

int main(){


    escolhepalavra();
    abertura();

    do {

        desenhaforca();
        chuta();


    }while (!acertou() && !enforcou());

    adicionapalavra();
}
6 respostas

Olá,

Seu código está incompleto,

Tenta subir ele num git da vida ou coloca ele aqui.

Não da para identificar o problema só com esse trecho de código.

atte

Exato o que o amigo relatou, outro questão é o arquivo banco.txt esta no mesmo diretorio do exe?

Sim o arquivo .txt esta no mesmo diretorio, tanto que ele abre para selecionar a palavra de forma aleatória. Segue o código completo:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include "forca.h"  

    char palavrasecreta[20];
    char chutes[26];
    int chutesdados = 0;

void abertura() {                     
     printf("=====================\n");
    printf("||  Jogo de Forca  ||\n");
    printf("=====================\n\n");
}

void chuta(){

        char chute;

        scanf (" %c", &chute);

        chutes[(chutesdados)] = chute;
        (chutesdados)++;

}

int jachutou(char letra){    

        int achou = 0;

        for(int j=0; j< chutesdados;j++){ 

            if (chutes[j]==letra) {

                achou = 1;
                break;
            }
        }
        return achou;
}

void desenhaforca(){

    printf("Você já deu %d chutes\n", chutesdados);

    for(int i = 0; i < strlen (palavrasecreta); i++){ 

            int achou = jachutou(palavrasecreta[i]);


            if(achou){
                printf("%c ", palavrasecreta[i]);

            }
            else{
                printf ("_ ");
            }
        }
        printf ("\n");
}

void adicionapalavra(){

    FILE *f;
    char quer;
    printf("Voce deseja adicionar uma nova palavra ao jogo (S/N)\n");
    scanf(" %c", &quer);

    if(quer=='S'){


        char novapalavra[20];
        printf("Qual a nova palavra?(digite em letras maiusculas)");
        scanf("%s", novapalavra);



        f = fopen("palavras.txt", "r+");

            if(f == 0){
                printf("Desculpa, banco de dados indisponivel\n\n");
                exit(1);
            }


            int qtd;
            fscanf(f, "%d", &qtd);
            qtd++;

            fseek(f, 0, SEEK_SET);
            fprintf(f, "%d", qtd);

            fseek(f, 0, SEEK_END);

        fprintf(f, "\n %s", novapalavra);


    }
fclose(f);
}

void escolhepalavra(){

    FILE *f;

    f = fopen("palavras.txt", "r");

    if(f == 0) {
        printf("Desculpa, banco de dados indisponivel\n\n");
        exit(1);
    }

    int qtddepalavras;
    fscanf(f, "%d", &qtddepalavras);

    srand(time(0));
    int randomico = rand() % qtddepalavras;

    for(int i =0; i<=randomico;i++){
        fscanf(f, "%s", palavrasecreta);
    }

        fclose(f);

}

int acertou(){
        for(int i=0;i<strlen(palavrasecreta);i++){
            if(!jachutou(palavrasecreta[i])){
                return 0;
            }
        }

        return 1;
}

int enforcou() {

    int erros=0;
    for(int i = 0; i<chutesdados;i++){
        int existe=0;

        for(int j = 0; j<strlen(palavrasecreta); j++){
            if(chutes[i]==palavrasecreta[j]){

                existe=1;
                break;
            }
        }

        if(!existe) erros++;
    }

    return erros >= 6;
}

int main(){


    escolhepalavra();
    abertura();

    do {

        desenhaforca();
        chuta();


    }while (!acertou() && !enforcou());

    adicionapalavra();
}

forca.h

void abertura();
void chuta();
void desenhaforca();
void escolhepalavra();
int acertou();
int enforcou();
int jachutou(char letra);
void adicionapalavra();

Olá,

Dei uma olhada no teu arquivo e tem algumas idéias para vc:

Nessa Função:

void escolhepalavra() {
    FILE* f;

    fopen_s(&f, "palavras.txt", "r");

    if (f == 0) {
        printf("Desculpa, banco de dados indisponivel\n\n");
        exit(1);
    }

    int qtddepalavras = 0;   // <------ Iniciei com 0 pura Neura minha
    fscanf(f, "%d", &qtddepalavras);    
    srand(time(0));

    int randomico = rand() % qtddepalavras;

    for (int i = 0; i <= randomico; i++) {

        // Esse IF é para colocar dentro da palavrasecreta, o que foi sorteado na variável randomico
        fscanf(f, "%s", palavrasecreta);
        if ( i == randomico) {            
            break;
        }
    }
    fclose(f);
}

O Meu AdicionaPalavra ficou assim:

void adicionapalavra() {
    FILE* f;
    char quer;
    printf("Voce deseja adicionar uma nova palavra ao jogo (S/N)\n");
    scanf(" %c", &quer);

    if (quer == 'S') {
        char novapalavra[20];
        printf("Qual a nova palavra?(digite em letras maiusculas):\n");
        scanf("%s", novapalavra);

        fopen_s(&f, "palavras.txt", "r+");

        if (f == 0) {
            printf("Desculpa, banco de dados indisponivel\n\n");
            exit(1);
        }

        int qtd = 0;
        fscanf(f, "%d", &qtd);
        qtd++;

        fseek(f, 0, SEEK_SET);
        fprintf(f, "%d", qtd);

        fseek(f, 0, SEEK_END);

        fprintf(f, "\n%s", novapalavra); 

        fclose(f);
    }    
}

Da uma olhada, espera ajudar

Diego, a função 'fopen_s' aparece como não declarada, pertence a qual biblioteca?

A desculpa, é que eu uso o Visual Studio 2019.

Vc tem que alterar para o que vc já estava usando fopen