PDA

Visualizza la versione completa : [C] Leggere random da un file


Attila
31-03-2005, 17:18
Ciao!
Ho fatto un programma che legge random da un file.txt, dove ci sono un elenco di parole, due parole prese in un ordine qualsiasi.. solo che quando lo vado ad eseguire c'è qualcosa che non va..
Ecco il codice chi mi sa aiutare gentilmente?


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

int main()
{
FILE *fpr;
int righe = 0;
printf("Quante squadre ci sono?\n");
scanf("%d", &righe);
char string[righe][100];
int i=0; int random = 0; int random2 = 0;

if ( ( fpr = fopen("file.txt","r")) == NULL)
{
printf("Il file non può essere aperto");
}
else
{
while( !feof(fpr) )
{

fgets(string[i], 1 , fpr);
i++;
}

fclose(fpr);
}

srand(time(NULL));
random = rand() % (righe +1);
system("PAUSE");
random2 = rand() % (righe +1);

if(random2 == random);
random2 = rand() % (righe +1);

printf("Prima estratta: %s", string[random]);
printf("Seconda estratta: %s", string[random2]);

return 0;
}

Ringrazio in anticipo :)

Tigre851
31-03-2005, 20:42
esattamente cos'è che non va?

Tigre851
31-03-2005, 20:50
Originariamente inviato da Attila

int righe = 0;
printf("Quante squadre ci sono?\n");
scanf("%d", &righe);
char string[righe][100];



di sicuro almeno questo è sbagliato (devo ancora guardare il resto...) non puoi dichiarare una array o una matrice dandogli un numero di righe con una variabile...

char stringa[100][100] //ok
char stringa[righe][100] //errore!

se vuoi dichiarare un array in maniera dinamica devi usare l'allocazione dinamica della memoria (è da tanto che non prog in c cmq le funzioni per l'allocazione dinamica dovrebbero essere malloc calloc realloc e free prova a fare una ricerca se ti interessano) cmq l'allocazione dinamica ha dei pro e dei contro e di solito è sconsigliata a meno che sia l'unica soluzione... nel tuo caso penso si possa evitare...

unit1
31-03-2005, 20:54
Ammetto la mia ignoranza, mi spieghi la funsione random in c,
perfavore?
non la ho trovata nei manuali!

Tigre851
31-03-2005, 20:54
random = rand() % (righe +1);

perchè righe+1? il tuo numero deve essere da 0 a 99 perchè questo è il range di elementi dell'array quindi:



random = rand() % (righe);


inoltre così:

if(random2 == random);
random2 = rand() % (righe);

non è detto che random2 si diverso da random meglio un

do{
random2 = rand() % (righe);
}while(random2==random);

Tigre851
31-03-2005, 21:07
Originariamente inviato da unit1
Ammetto la mia ignoranza, mi spieghi la funsione random in c,
perfavore?
non la ho trovata nei manuali!

restituisce un intero pseudocasuale compreso tra 0 e RAND_MAX...

prima di utilizzarla devi chiamare la funzione void srand(int seme) che in un certo senso per semplicità "rimescola l'urna" dei numeri che verranno estratti...

è bene che il seme cambi di volta in volta si usa quindi la funzione time() ovvero

srand(time(NULL));

P.S. http://utenti.lycos.it/SourceNet/faq_c.htm al punto 3.5

unit1
31-03-2005, 21:15
Originariamente inviato da Tigre851
restituisce un intero pseudocasuale compreso tra 0 e RAND_MAX...

prima di utilizzarla devi chiamare la funzione void srand(int seme) che in un certo senso per semplicità "rimescola l'urna" dei numeri che verranno estratti...

è bene che il seme cambi di volta in volta si usa quindi la funzione time() ovvero

srand(time(NULL));

grazie per avermi risposto. In che senso il "seme"?

Unit1

Tigre851
01-04-2005, 00:56
deve essere una cosa statistica... sinceramente non mi è molto chiaro... :confused: però ai fini dell'utilizzo di rand che faccio io non mi è mai servito saperlo... se qlc ha delle delucidazioni sono ben accette... ciao!

Johnny_Depp
01-04-2005, 06:56
a me è venuta in mente una roba del genere... :fagiano:
legge il numero dei record presenti nel file txt
e alloca dinamicamente la memoria necessaria a contenere
tutti i record in una matrice bidimensionale matrix[righe == numero_record][colonne == valore_record]
(questo per non chiedere all'utente di inserire il numero dei record da leggere nel file)
Per l'estrazione casuale di due record ho usato rand() e Sleep()... p.s. il codice è commentato

#include <stdio.h> /* I/O standard */
#include <stdlib.h> /* system() malloc() free() */
#include <time.h> /* srand() rand() */
#include <windows.h> /* Windows API Sleep() */

int main()
{
FILE *pf; /* puntatore al file */
int TeamNum = 0; /* numero dei record presenti nel file (uno per ogni riga)*/
char **TeamNam; /* matrice che conterrà i record presenti nel file txt */
int i = 0, j = 0, SelectF = 0, SelectS = 0; /* altre variabili: SelectF == Select First, SelectS == Select Second */

/* PARTE PRIMA (catturo dinamicamente i records presenti nel file: senza chiedere nulla all'utente) */

if ( ! ( pf = fopen("file.txt","r")))
{
printf("Il file non può essere aperto");
system("pause");
return 1;
}
else
{
/* leggo il numero delle righe (ogni riga una stringa/record) */
while( 1 )
{
fread(&j, sizeof(char) , sizeof(char), pf);
if( feof(pf) ) break;
if( j == '\n') i++;
}

/* alloco dinamicamente la memoria per il numero delle righe trovate (=i) */
if( ! (TeamNam = (char **) malloc(i * sizeof(char *))) )
{
printf("Impossibile allocare la memoria\n");
system("pause");
return 1;
}

/* mi (ri)posiziono ad inizio file (primo byte) */
fseek(pf, 0, 0);

/* alloco la memoria per ogni colonna/record della riga (ogni record non deve superare i 50 caratteri) */
for( j = 0; j < i; j++)
{
if( ! (TeamNam[j] = (char *) malloc(50 * sizeof(char))) )
{
printf("Impossibile allocare la memoria\n");
system("pause");
return 1;
}

/* inserisco il record all'interno della colonna della matrice */
fgets(TeamNam[j], 50 , pf);
}

fclose(pf);
}

/* numero totale dei record trovati */
printf("totale squadre: %d\n\n", --i);

/* stampo a video tutti i record preseti nel file (caricati nella matrice) */
for( j = 0; j < i; j++ )
printf("%.2d - %s", j, TeamNam[j]);

/* PARTE SECONDA */

/* estraggo un numero random compreso tra 0 e il numero massimo delle righe/record trovati nel file txt */
srand(time(NULL));
SelectF = rand() % i;

/* aspetto 2 secondi */
Sleep(2000);

/* estraggo random anche il secondo numero (lo accetto solo se diverso dal primo) */
while ( 1 )
{
srand(time(NULL));
SelectS = rand() % i;
if( SelectS != SelectF ) break;
}

printf("\nMatch del giorno\n\n");

/* sfoglio la matrice e stampo a video il record/stringa corrispondente al primo numero estratto con random */
for( j = 0; j < i; j++ )
{
if( j == SelectF )
printf("%.2d - %s", j, TeamNam[j]);
}

/* sfoglio la matrice e stampo a video il record/stringa corrispondente al secondo numero estratto con random (ovviamente diverso dal primo) */
for( j = 0; j < i; j++ )
{
if( j == SelectS )
printf("%.2d - %s", j, TeamNam[j]);
}

/* libero la memoria allocata precedentemente per la matrice */
for( j = 0; j < i; j++ )
{
free(TeamNam[j]);
}
free(TeamNam);

printf("\n");
system("pause");

return 0;
}
il file .txt l'ho strutturato nel seguente modo:

0milan
1juventus
2inter
3udinese
4roma
5lazio
6parma
7sampdoria
8palermo
9messina
n.b. chi cerca delucidazioni sulle funzioni (rand() Sleep() etc etc) presenti in questo listato, faccia una ricerca utilizzando il motore del forum: se ne è ampiamente parlato

Attila
01-04-2005, 09:12
Ti ringrazio Johnny decisamente (più) funzionale ;)

Loading