Ir ao conteúdo

Problema com arquivo em C


Ricardo HD

Posts recomendados

Postado

Bom dia a todos.

Galera to fazendo um programa para gerar N jogos da mega sena e salva-los em arquivo. O meu programa ta gerando os numeros mas não to conseguindo salvar em arquivo, cria o arquivo mas não salva nada, tbem não consigo separar os numeros sorteados, ficam juntos ex. 161215646 63279846

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

#define N 8

int sorteio () {
int ran[6],condicao, aux;

for (int j = 0; j<N; j++)
{
for (int i = 0; i<N; i++ ){

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

if (ran[i] == ran[j])
{
ran[i] = (rand() % 60) + 1;
j = -1;
}
}
printf(" %4d \t", ran[i]);
}
}

}
int main (){

srand(time(NULL));
FILE*arg;
arg = fopen ("D:\\regsorteio.txt", "r+b");
if (arg == NULL)
arg = fopen ("D:\\regsorteio.txt", "w+b");

sorteio ();

fclose (arg);
system ("PAUSE");
return (0);

}

Postado

Só um detalhe sobre seu código. Ele está escrito em C++, não em C. A linguagem C não permite declaração de variáveis na primeira sessão do for.

Postado
Só um detalhe sobre seu código. Ele está escrito em C++, não em C. A linguagem C não permite declaração de variáveis na primeira sessão do for.

O código está em C, mas essa parte à que você se referiu realmente o amigo lá escreveu em C++.

Pra resolver, é só declarar as variáveis sempre no inicio das funções, seja a main ou não.

Postado

Não sei se é realmente isso, mas os números gerados são grandes mesmo, dando a impressão que estão "colados", aqui rodou sem problemas, apenas o valor dos números é maior do que 60...

Postado

Se você quer apenas gerar uma sequência de 6 números aleatórios variando de 0 a 60 não precisa dessa complicação toda com essa porrada de for's. Veja só como é simples:


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

void sorteio (FILE *output_file) {
int i, r;
srand (time (NULL));
for (i = 0; i < 6; i++){
r = rand() % 61;
fprintf(output_file, "%d ", r);
}
fprintf(output_file, "\n");
}

int main (){
srand(time(NULL));
FILE *arg;
arg = fopen ("regsorteio.txt", "ab+");
if (arg == NULL){
fprintf(stderr, "Falha ao criar arquivo\n");
return 1;

}
sorteio (arg);
fclose (arg);
/* system ("PAUSE"); */
return (0);
}

Agora, comentando:

 arg = fopen ("regsorteio.txt", "ab+"); 

Não precisa utilizar o modo "b", que serve para abrir o arquivo em modo binário. E nem aquele seu "if" para testar se o arquivo existe ou não, basta usar o modo "a+", append para leitura e escrita, modo que, se o arquivo não existir, será criado, e, se existir, colocará o cursor no final do arquivo de modo que qualquer informação nele escrito será adicionada ao final do arquivo.

 sorteio (arg); 

Passo à função "sorteio(arg)" o ponteiro para o arquivo que foi aberto em


FILE *arg;
arg = fopen ("regsorteio.txt", "ab+");

Para que, após gerar os números aleatórios, possa usar a função "fprintf"para imprimir as informações no arquivo.


for (i = 0; i < 6; i++){
r = rand() % 61;
fprintf(output_file, "%d ", r);
}

Um for de 6 iterações, onde em cada iteração será:

01 - gerado um número inteiro pseudo-aleatório, de valor contido entre 0 e 60, com a linha

r = rand() % 61; 

02 - Impresso o valor gerado no arquivo aberto, seguido de um espaço em branco, com a linha

 fprintf(output_file, "%d ", r); 

De modo que cada linha do arquivo conterá 6 valores inteiros pseudo-aleatórios separados por um espaço. Após a escrita da linha, uma nova chamada à função fprintf()

 fprintf(output_file, "\n"); 

para imprimir no arquivo nada mais do que o caractere '\n', que corresponde ao newline, para pular uma linha.

Lembrando que a chamada a função srand (time (NULL)); retorna o valor em segundos como seed, o que significa que, esta chamada estando dentro da função sorteio(), e como esse programa é extremamente leve e simples, usar algo como

 
for(int aux = 0; aux < 8; aux++){
sorteio(arg);
}

para gerar 8 sorteios diferentes vai resultar em 8 sequências de números idênticas, pois o srand( time(NULL) ); vai rodar 8 vezes em menos de 1 segundo, resultando em o mesmo seed enviado para a função srand() 8 vezes consecutivas, de maneira que ela irá gerar 8 sequências iguais. Para alterar a sequência de números a ser gerada é necessário esperar pelo menos 1 segundo entre cada chamada a função sorteio() ou então alimentar a função srand() do lado de fora da função sorteio(). Exemplo:


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

void sorteio (FILE *output_file) {
int i, r;
for (i = 0; i < 6; i++){
r = rand() % 61;
fprintf(output_file, "%d ", r);
}
fprintf(output_file, "\n");
}

int main (){
srand(time(NULL));
FILE *arg;
arg = fopen ("regsorteio.txt", "ab+");
if (arg == NULL){
fprintf(stderr, "Falha ao criar arquivo\n");
return 1;

}
/* srand fora da função sorteio! */

srand(time (NULL));
for(int aux = 0; aux < 8; aux++){
sorteio (arg);
}
fclose (arg);
/* system ("PAUSE"); */
return (0);
}

Este código gera 8 sequências diferentes de números pseudo-aleatórios. Mas se forem feitas duas chamadas a este programa em menos de 1 segundo, ele irá gerar um conjunto de 8 sequências diferentes, e depois uma cópia do mesmo conjunto.

PS.: o C aceita sim declaração de variáveis no for, no estilo


for(int i = 0; i < 50; i++){
bla bla bla;
}

Mas apenas no padrão C99. Para quem usa o GCC como compilador é só especificar a flag "std=c99" na linha de comando, pelo menos no linux é asim.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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