Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

[Bug] Quando adiciona palavra no arquivo pula uma linha.

Segui o passo a passo certinho, cheguei até a copiar o código disponibilizado no final do capítulo para ter certeza que não era erro de programação, mas toda vez que tento escrever uma nova palavra no arquivo txt pula uma linha a mais. Antes de adicionar a lista está assim no arquivo txt:

3
MELANCIA
MELAO
MORANGO

Após adicionar:

4
MELANCIA
MELAO
MORANGO

ABACATE

Estou utilizando o compilador GCC no linux ubuntu 20.04.5 LTS, o código é exatamente o mesmo do curso, testei também com o disponível para download ao final do curso e isso também aconteceu.

5 respostas

Oi, Diego! Tudo bem?

Isso pode estar acontecendo devido à forma como o arquivo está sendo manipulado no código, então, antes de mais nada, é necessário que você compartilhe todo o seu projeto para que assim eu possa fazer testes para identificar o porquê isso está acontecendo.

Fico no aguardo e à disposição

Oi Armando, segue o código.

forca.c

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

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


int letraexiste(char letra) {

    for(int j = 0; j < strlen(palavrasecreta); j++) {
        if(letra == palavrasecreta[j]) {
            return 1;
        }
    }

    return 0;
}

int chuteserrados() {
    int erros = 0;

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

        if(!letraexiste(chutes[i])) {
            erros++;
        }
    }

    return erros;
}

int enforcou() {
    return chuteserrados() >= 5;
}

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

    return 1;
}


void abertura() {
    printf("/****************/\n");
    printf("/ Jogo de Forca */\n");
    printf("/****************/\n\n");
}

void chuta() {
    char chute;
    printf("Qual letra? ");
    scanf(" %c", &chute);

    if(letraexiste(chute)) {
        printf("Você acertou: a palavra tem a letra %c\n\n", chute);
    } else {
        printf("\nVocê errou: a palavra NÃO tem a letra %c\n\n", 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() {

    int erros = chuteserrados();

    printf("  _______       \n");
    printf(" |/      |      \n");
    printf(" |      %c%c%c  \n", (erros>=1?'(':' '), (erros>=1?'_':' '), (erros>=1?')':' '));
    printf(" |      %c%c%c  \n", (erros>=3?'\\':' '), (erros>=2?'|':' '), (erros>=3?'/': ' '));
    printf(" |       %c     \n", (erros>=2?'|':' '));
    printf(" |      %c %c   \n", (erros>=4?'/':' '), (erros>=4?'\\':' '));
    printf(" |              \n");
    printf("_|___           \n");
    printf("\n\n");

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

        if(jachutou(palavrasecreta[i])) {
            printf("%c ", palavrasecreta[i]);
        } else {
            printf("_ ");
        }

    }
    printf("\n");

}

void escolhepalavra() {
    FILE* f;

    f = fopen("palavras.txt", "r");
    if(f == 0) {
        printf("Banco de dados de palavras não disponível\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);
}


void adicionapalavra() {
    char quer;

    printf("Você deseja adicionar uma nova palavra no jogo (S/N)?");
    scanf(" %c", &quer);

    if(quer == 'S') {
        char novapalavra[TAMANHO_PALAVRA];

        printf("Digite a nova palavra, em letras maiúsculas: ");
        scanf("%s", novapalavra);

        FILE* f;

        f = fopen("palavras.txt", "r+");
        if(f == 0) {
            printf("Banco de dados de palavras não disponível\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);

    }

}

int main() {

    abertura();
    escolhepalavra();

    do {

        desenhaforca();
        chuta();

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

    if(ganhou()) {
        printf("\nParabéns, você ganhou!\n\n");

    } else {
        printf("\nPuxa, você foi enforcado!\n");
        printf("A palavra era **%s**\n\n", palavrasecreta);
    }

    adicionapalavra();
}

forca.h

int enforcou();
int ganhou();
void abertura();
void chuta();
int jachutou(char letra);
void desenhaforca();
void escolhepalavra();
void adicionapalavra();
int letraexiste(char letra);
int chuteserrados() ;
#define TAMANHO_PALAVRA 20

palavras.txt

3
MELANCIA
MELAO
MORANGO

Opa, Diego, Bom dia!

Testando o seu código, o único caso em que ele cria esse espaço entre as palavras quando você adiciona uma nova palavra no seu arquivo .txt, é quando você faz uma quebra de linha após a última palavra, deixando um espaço vazio. Assim, quando a nova palavra for adicionada, ela será adicionado depois dessa espaço vazio.

Segue um GIF para exemplificar melhor:

GIF de demostração da diferença de adição da palavra no txt caso tenha um espaço vazio ou não no fim do arquivo

Então, como pode ver no GIF, o fato da linha 6 está vazio, mas ainda representar um espaço, fez com que a palavra seja adicionada na linha abaixo dela. Com isso, se esse for o seu caso, a solução é simplesmente apagar essa linha vazia.

Espero que isso solucione o seu problema!

Oi Armano, não é esse o caso, fiz um video também demonstrando o bug, achei mais fácil por no youtube, segue o link. Como pode ver não tem linhas vazias no txt e mesmo assim o problema ocorre, já revisei o código, testei com o código que o professor do curso C (Anishe) disponibiliza para download e esse bug ocorreu, estou acredintando que pode ser algum problema de versão com o compilador ou o sistema operacional, é possivel isso?

solução!

Opa, Diego! Joia?

Essa é uma situação bem curiosa, até instalei o Ubuntu em uma VM para testar no mesmo sistema operacional que você, mas funcionou corretamente, sem saltar nenhuma linha.

E sobre o problema ser a versão do compilador, imagino que não seja o caso, imagino que esteja usando o GCC para compilar o código e esse compilador não recebe atualizações a um bom tempo, mas recomendo que tente atualizar todos os seus pacotes com sudo apt update e sudo apt upgrade -y.

Mas caso mesmo assim não funcione, recomendo que tente usar alternativas online:

Ambos sites contam com um ambiente onde você pode adicionar vários arquivos, sendo o primeiro um pouco mais simples e restrito a compilar códigos em C e o segundo tendo compatibilidades com diversas linguagens.

Espero que uma das sugestões resolva o seu problema!