Ir ao conteúdo
  • Cadastre-se

C "Numerar" strings de um arquivo


Posts recomendados

@Bruno Vercelli Você pode ler o arquivo com a função fopen() usando o modo read ("r"), usar um loop para verificar quantas linhas tem no seu arquivo e depois usar a função rand() para gerar um número aleatório com base nessa quantidade de linhas. Por fim, é só fazer um loop contendo a função fgets() para ler as palavras no arquivo até que chegue na linha que foi determinada aleatoriamente.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@Bruno Vercelli      se você usar a função fscanf em um arquivo do tipo txt , você consegue ler uma palavra de cada vez ,  então depois de abrir o arquivo , use um loop começando de zero e indo até enquanto for menor que o número gerado pelo rand , assim a última palavra lida no arquivo estará na variável usada no fscanf .

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

1 hora atrás, devair1010 disse:

@Bruno Vercelli      se você usar a função fscanf em um arquivo do tipo txt , você consegue ler uma palavra de cada vez ,  então depois de abrir o arquivo , use um loop começando de zero e indo até enquanto for menor que o número gerado pelo rand , assim a última palavra lida no arquivo estará na variável usada no fscanf .

Perfeito, obrigado!

adicionado 5 minutos depois
33 minutos atrás, Mauro Britivaldo disse:

Você quer mesmo esse procedimento em fluxo de arquivo, ou não pensou em usar vetores. 

@Mauro Britivaldo Então Mauro, só pra contextualizar eu estou desenvolvendo um Jogo da Forca para um trabalho da faculdade. Nele, há uma função responsável por gerar palavradas aleatórias e as dicas correspondentes a tais palavras. O que tenho no momento é um número n tal que

n = rand() % 16
  switch (n){
    case 0: 
  		strcpy(palavra, "FUTEBOL");
  		strcpy(dica, "ESPORTE");
    case 1: ...
     ...
  }

(EXEMPLO)

 

(tenho 15 palavras/dicas)

 

Pensei em passar as palavras para um arquivo, as dicas para outro, gerar um número e pegar a palavra e a dica correspondentes e tal número, sacou?

 

Aceito sugestões.

 

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

assim você pode contar as palavras

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(){
	FILE *fp;
	int count = 0;
	char c;
	if ((fp=fopen("temp.txt", "r"))==NULL)
	{
		printf("DEU ERRO");
		exit(1);
	}
	while((c=getc(fp))&&(!feof(fp)))
	if ( c == ' ' || c == '\n' )count++;
	fclose(fp);
	printf("%d\n", count);
	return (0);
}

 

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

@Bruno Vercelli

Lembre-se que você terá que inserir a função rand() da seguinte forma:

rand() % ((maior número - menor número) + 1) + menor número

Como não existe linha 0, o intervalo seria de 1 a 16. Então o que você tinha feito:

39 minutos atrás, Bruno Vercelli disse:

n = rand() % 16

Deveria ser:

n = rand() % 16 + 1

 

39 minutos atrás, Bruno Vercelli disse:

(tenho 15 palavras/dicas)

Não eram 16 palavras?

No caso, eu e @devair1010 propomos ideias semelhantes, mas ele explicou melhor. 😁

Se você tem certeza de que são 16 linhas, e que isso não vai mudar, você não precisa de um loop para contar as linhas, mas o ideal seria ter, para caso acrescentasse ou retirasse palavras, ou usasse essa função em outro programa.

 

Resumindo, você pode fazer o seguinte: apenas abra o arquivo texto no modo de leitura, gere um numero entre 1 e 16 e use fgets() ou fscanf() dentro de um loop para ler as palavras até que chegue na linha/palavra desejada.

Se o usuário precisar de dicas, você pode dar a ele uma letra aleatória da palavra escolhida, ou então pode descrever a palavra, como você já estava fazendo: apenas identifique de qual palavra se trata e imprima a dica. Mas antes, faça isso daí acima.

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Lucca Rodrigues disse:

@Bruno Vercelli

Lembre-se que você terá que inserir a função rand() da seguinte forma:


rand() % ((maior número - menor número) + 1) + menor número

Como não existe linha 0, o intervalo seria de 1 a 16. Então o que você tinha feito:

Deveria ser:


n = rand() % 16 + 1

 

Não eram 16 palavras?

O que você considera uma dica? Uma letra?

No caso, eu e @devair1010 propomos ideias semelhantes, mas ele explicou melhor.

Se você tem certeza de que são 16 linhas, e que isso não vai mudar, você não precisa de um loop para contar as linhas. Apenas abra o arquivo texto no modo de leitura, gere um numero entre 1 e 16 e use fgets() ou fscanf() dentro de um loop para ler as palavras até que chegue na linha/palavra desejada.

Se o usuário precisar de dicas, você pode dar a ele uma letra aleatória da palavra escolhida, mas antes, faça isso daí acima.

Realmente, são 16 palavras. 

Uma dica é uma string tambem, exemplo: palavra - "FUTEBOL" / dica - "ESPORTE"

 

Está funcionando quase perfeito. Só estou tentando desconsiderar o '\n' que o fgets recebe.

 

EDIT: Tudo perfeito!

 

Muito obrigado a todos pela sugestão.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Bruno Vercelli Eu tinha feito um programinha que procurava várias palavras em arquivos texto e as concatenava em uma string.

Pra excluir os \n's, eu usei a seguinte função:

void remove_enter(char *str){
    int cont = 0, i;
    for(i = 0; str[i]; i++){
        if(str[i] != '\n'){
            str[cont++] = str[i];
        }
    }
    str[cont] = 0;
}

 

11 minutos atrás, Bruno Vercelli disse:

Uma dica é uma string também, exemplo: palavra - "FUTEBOL" / dica - "ESPORTE"

Não precisa ser necessariamente uma string. Você pode identificar certa palavra e imprimir na tela a dica respectiva. Você usaria apenas estruturas condicionais.

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

14 horas atrás, Bruno Vercelli disse:

Só estou tentando desconsiderar o '\n' que o fgets recebe

 

🤔 mesmo sabendo que ele está fixo no final da string? Para um vetor

       char* dica;

não bastaria escrever 

	dica[strlen(dica) - 1] = 0;

? Bastaria.
 

14 horas atrás, Lucca Rodrigues disse:

Pra excluir os \n's, eu usei a seguinte função

 

É possível, mas é fixa a posição do '\n' nesse caso. Vai chamar uma função, que leva uma eternidade comparada a uma simples atribuição, e varrer a string toda até o fim...

  • Curtir 2
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

2 horas atrás, arfneto disse:

 

🤔 mesmo sabendo que ele está fixo no final da string? Para um vetor


       char* dica;

não bastaria escrever 


	dica[strlen(dica) - 1] = 0;

? Bastaria.
 

 

É possível, mas é fixa a posição do '\n' nesse caso. Vai chamar uma função, que leva uma eternidade comparada a uma simples atribuição, e varrer a string toda até o fim...

Realmente, funcionou certinho essa solução e é bem mais prática que a minha.

 

Desculpa a ignorância mas nesse caso o caractere correspondente a dica[strlen(dica) - 1] seria o \n e você o substitui por um caractere nulo (0)? 

 

Obrigado.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Sim. Como pensou.

 

strings em C são terminadas em zero. fgets() leu ou incluiu o \n porque é super prático. Em geral você quer gravar em outro arquivo e assim do jeito que veio vai.

 

ao colocar um zero lá a string diminui em um byte. Se alocou estaticamente não faz diferença porque um char[30] é um char[30] por exemplo. E se alocou dinamicamente também não porque a alocação é por tamanho também, não por conteúdo.

 

 

  • Curtir 2
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

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