01/01/11 12:19
Pitagora
In primis devi conoscere quanti caratteri sono presenti nel file. Estrarre un numero random, attenzione il massimo numero dovrà essere il numero di caratteri presenti nel file. Partendo dall'inizio del file richiamare la funziona fseek: come secondo argomento gli passiamo il numero random. Adesso il file punta in una parte random
infine utilizzare la funzione fgetc per prelevare un carattere.
Ciao
Ultima modifica effettuata da Pitagora 01/01/11 12:21
aaa
01/01/11 12:31
-Meng0-
Ok, certo per il massimo random
Ma il punto è che il numero random sarebbe quello che mi indica l'indice della riga!
Non devo puntare in una parte random, ma ad una riga random!
Visto che ogni riga contiene una sola parola puntare ad una riga equivale a puntare ad una parola!
Ed in più, una volta raggiunta la riga come estrarre tutta la parola contenuta e non solo un carattere?
Ultima modifica effettuata da -Meng0- 01/01/11 12:32
aaa
01/01/11 13:16
TheKaneB
i file di solo testo non sono indicizzati, di conseguenza qualsiasi algoritmo che tu possa escogitare avrà complessità O(n) con n=dimensione del file.
Preso atto di questa triste notizia, implementa un algoritmo che tiri un numero X a caso, legga le prime X-1 righe (buttando via il contenuto che tanto non ti serve) e conservi la X-esima riga in una variabile per poi farne quello che vuoi.
Esistono tanti altri algoritmi, ma partendo da un file ASCII nessuno di questi sarà più veloce (nel caso in cui tu voglia accedere per forza alla X-esima riga in modo diretto).
Un metodo diverso sarebbe quello di puntare su un byte a caso, scansionare il file da quel byte in poi, e prelevare il contenuto della prima coppia di ritorni a capo che incontri (quindi ci vuole una getc() finchè non trovi un'andata a capo e poi una gets() per prelevare la stringa successiva).
In questo caso non puoi sapere qual è la posizione della parola (quindi addio all'X-esima riga di cui sopra), però ottieni comunque una parola rando con uguale probabilità e risparmi tanto tempo di calcolo e soprattutto di accesso al file (che è la parte più lenta).
aaa
01/01/11 13:35
-Meng0-
void Preleva_Parola(void)
{
FILE *fp = fopen("C:\Documents and Settings\-\-\Dizionario.txt", "r"
;
long random = Genera_Random();
fseek(fp, random, 1);
char ch;
while ((ch = fgetc(fp)) != '\n')
continue;
fgets("%s", 30, fp);
system("pause"
;
}
Però non va, si impalla proprio l'applicazione chiedendomi di fare "Termina Adesso"
Ultima modifica effettuata da -Meng0- 01/01/11 13:42
aaa
01/01/11 13:39
Pitagora
Controlla bene le funzioni; non si richiamano così
aaa