Oppure

Loading
01/01/11 11:56
-Meng0-
Devo preparare un progetto all'interno del quale mi serve una funzione che mi prelevi una parola random all'interno di un file contenente tutte le voci del dizionario italiano (.txt).
Non so da che parte farmi per la suddetta funzione:(
Aiuto!
aaa
01/01/11 12:19
-Meng0-
Sarò più preciso, nella fretta sono stato vago;)
Riesco tramite una prima implementazione della funzione a leggere correttamente dal file. Però in maniera ordinata e partendo dalla prima riga. (Ogni riga contiene una sola parola). Come posso fare, ad esempio, a leggere direttamente la 72° riga? Perchè vi spiego, genererei un numero pseudo random e andrei a leggere la riga (e quindi la parola) corrispondere alla posizione casuale generata, è quello il mio scopo. Devo capire come fare a leggere una determinata riga!
aaa
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 :rotfl: 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:23
-Meng0-
Beh sì, in fatto di costo computazionale degli algoritmi di cui stiamo parlando hai pienamente ragione, avevo pensato anche io comunque di arrivare appunto "in fondo" alla riga alla quale mi punterà un byte a caso, scorrere fino a trovare un /n, e iniziare la lettura dalla stringa successiva.
Grazie mille per l'aiuto, ora ci provo e vi faccio sapere;)
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