Ir ao conteúdo
  • Cadastre-se
david nilo

C gerar palavra aleatoria arquivo.txt

Recommended Posts

bom dia pessoal,

estou com um probleminha neste codigo, ele deveria pega gerar uma palavra aleatoria através de uma lista no formato txt.

exemplo da lista: 

mesa

carro 

casa

etc..

antes estava gerando só a primeira linha do arquivo, porém fiz alguma alteração que o codigo só fica num loop infinito mostrando a mensagem lista não encontrada, mas a lista existe, por favor me ajudem, desde já agradeço..

codigo:

int main(){
    int indexPalavra; //Variável do controle do index da palavra
    int i, j; //Variáveis de controle de loop
    FILE *fp; //Ponteiro de arquivo
    char palavra[100]; //Varíavel pra armazenar a palavra
    fp = fopen("adicionar_conseq.txt", "r"); //Abre o arquivo
    if(fp) //Se arquivo existir
        { srand(time(NULL)); //Pega a semente do número aleatório
        indexPalavra = frand()%NUM_PALAVRAS; //Gera o número da palavra (index)
        for(i=0, j=0; j<indexPalavra; i++) //Enquanto não achar o index
            if(fgetc(fp) == '\n'){ //Se achar próxima palavra
                j++; //Passa para o próximo index;     /* Enquanto isso o ponteiro 'fp' armazena em si mesmo a posição do arquivo            que é navegada por 'fgetc()'. A cada consulta de caractere a posição do arquivo é passada pra frente */ }
                } else //Se não achar arqquivo
            { printf("\nLista nao encontrada.");
            fclose(fp); //destrói o ponteiro
             //Fecha o programa com sucesso
            }    //Basta ler a palavra agora
            i = -1;
            do    {
                i++;palavra = fgetc(fp); //Lê letra por letra
                if(palavra == '\0') //Se caractere lido for de próxima linha
                   break; //Terminou a palavra
            } while(sizeof(palavra)); //Enquanto não fim do arquivo
                palavra = '\0'; //Substitui o último caractere da palavra para indicar fim de frase    //Feche o arquivo
                fclose(fp);    //Daqui pra frente você implementa o jogo como quiser
                printf("Palavra: %s\n", palavra);
    } 
    return 0;
} 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poste o código de maneira adequada use o botão <> na caixa de edição de mensagem.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existe varias formas de fazer isso, veja essa abaixo:
 

#include<stdio.h>
#include<stdlib.h> //rand()
#include <time.h> //time()
#include <windows.h> //sleep

int sorteio ( int min, int max ) {
    return rand() % (max + 1 - min) + min ;
}

int main() {
    srand ( time ( 0 ) );
    char* nomeArquivo = "teste.txt";
    FILE *arquivo = fopen(nomeArquivo, "r");

    //comprova que o arquivo foi aberto
    if( arquivo == NULL ) {
        perror("Erro: ");
        getchar();
        exit(1);
    }

    //Declaramos aqui as variaveis restantes. Não há lógica declarar variaveis se não existe arquivo aberto >_<
    char palavra[1024]; //guarda uma palavra qualquer de maximo 1024 caracteres(Nunca vi palavra maior >_<)
    int nPalavras = 0;  //contador de palavras que haverá no arquivo
    int nSorteio;       //Guarda um numero sorteado de 0 a X que é o numero de palavras que podería conter no arquivo
    int i;

    //Contanmos quantas palavras tem o arquivo.
    //ATENÇAO! O ARQUIVO DEVERÁ TER UMA PALAVRA POR LINHA SOMENTE.
    while( fscanf( arquivo, "%s", palavra) != EOF ){
        //printf("%s\n", palavra);
        nPalavras++;
    }

    //"gerando" palavras
    while(1){
        //voltamos o ponteiro ao principio do arquivo para poder ler uma nova palavra
        rewind(arquivo);

        //Rand retorn um X numero.
        nSorteio = sorteio(0, nPalavras); //sorteia um numero de 0 a X. O X representa o numero de palavras que estão no arquivo
        //printf("*%d*", nSorteio); //Para saber que numeros estão gerando rand descomente esta linha

        //O que o for a continuação faz é: 
        //Capturar linha por linha, até chegar na linha X, que foi sorteada por rand. 
        //...Como esta será a ultima linha lida, conserva esta ultima linha(palavra). 
        /*
            Na realidade isso faz com que o ponteiro avance no arquivo, até a linha X que nos interessa, e como a ultima palavra capturada é 
            a linha de numero X que retornou rand, essa será a palavra que nos interessa, e é, a que será guardada por ultimo no 
            vetor palavra. Não é a forma mais elegante de se fazer, mas como se trata de um programa de estudos deixo desta forma.
        */
        for(i=0; i<nSorteio; i++){
                fscanf( arquivo, "%s", palavra);
        }

        printf("Palavra sorteada: %s\n", palavra);
        Sleep(500);
    }


    fclose(arquivo);

    return 0;
}

você precisa dominar muito bem arquivos se quiser realizar isso. Lhe recomendo que estudo mais sobre arquivos.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <locale>

struct InfoLinha
{
    char  nome[1024];
};

int main()
{
    setlocale(LC_ALL, "Portuguese");
    srand(time(NULL));

    FILE* arquivo = fopen("lista.txt", "r");

    // Verifica se o arquivo foi aberto com sucesso
    if (arquivo == NULL)
    {
        printf("Falha ao abrir o arquivo. Código do erro: %d\n", GetLastError());
        getchar();
        return 1;
    }

    size_t numLinhas = 0, tamanhoEstruturaArray = 10;

    // Aloca na memória inicialmente 10 posições(tamanhoEstruturaArray) para a estrutura que vai armazenar os nomes
    InfoLinha* linha = (InfoLinha*)malloc(tamanhoEstruturaArray);
    
    char nomePalavraAtual[1024] = { 0 };

    while (fscanf(arquivo, "%s", nomePalavraAtual) != EOF)
    {
        // Para caso de ter mais de 10 linhas, é necessário realocar, para evitar problemas de estouros de memória
        if (numLinhas > tamanhoEstruturaArray - 1)
        {
            tamanhoEstruturaArray *= 2;
            linha = (InfoLinha*)realloc(linha, tamanhoEstruturaArray);
        }

        // Copia o nome da linha atual para a posição atual da estrutura linha
        strcpy(linha[numLinhas].nome, nomePalavraAtual);
        
        // Incrementa o número de linhas
        numLinhas++;
    }

    printf("Número de linhas: %d\n", numLinhas);

    // Sorteando o número da linha de forma aleatória
    size_t numSorteado = rand() % numLinhas;

    printf("Palavra sorteada: %s\n", linha[numSorteado].nome);

    // Libera a memória que foi alocada para a estrutura
    free(linha);
  
    // Fecha o arquivo
    fclose(arquivo);

    return 0;
}

É um pouco parecida com a lógica do @vangodp, a cada vez que chegar no final da linha(\n) vai incrementar o número de linhas em + 1.
 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

obrigado amigo @vangodp,

vou dar uma estuda, para melhora minha manipulação de arquivo, vou fazer as alterações aqui no meu codgo e aviso se deu certo, obrigado..

adicionado 1 minuto depois

obrigado @cyer vou analisa o seu codigo tmb e vou fazer as alterações no meu, obrigado..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×