Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C] Leggere random da un file

    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?
    codice:
    #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
    http://www.tuttoirc.it Il Portale IRC Italiano

  2. #2
    esattamente cos'è che non va?
    Powered by MacOSX Lion

  3. #3

    Re: [C] Leggere random da un file

    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...
    Powered by MacOSX Lion

  4. #4
    Utente di HTML.it L'avatar di unit1
    Registrato dal
    Feb 2004
    Messaggi
    354
    Ammetto la mia ignoranza, mi spieghi la funsione random in c,
    perfavore?
    non la ho trovata nei manuali!

  5. #5
    codice:
    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:

    codice:
    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);
    Powered by MacOSX Lion

  6. #6
    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
    Powered by MacOSX Lion

  7. #7
    Utente di HTML.it L'avatar di unit1
    Registrato dal
    Feb 2004
    Messaggi
    354
    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

  8. #8
    deve essere una cosa statistica... sinceramente non mi è molto chiaro... però ai fini dell'utilizzo di rand che faccio io non mi è mai servito saperlo... se qlc ha delle delucidazioni sono ben accette... ciao!
    Powered by MacOSX Lion

  9. #9
    a me è venuta in mente una roba del genere...
    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
    codice:
    #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:
    codice:
    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
    ...Terrible warlords, good warlords, and an english song

  10. #10
    Ti ringrazio Johnny decisamente (più) funzionale
    http://www.tuttoirc.it Il Portale IRC Italiano

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.