Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - C occorrenze parole in un file
Forum - C/C++ - C occorrenze parole in un file

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
mxxforever (Normal User)
Newbie


Messaggi: 7
Iscritto: 25/07/2010

Segnala al moderatore
Postato alle 14:57
Domenica, 25/07/2010
Salve a tutti, sto realizzando un progetto in C che prevede la lettura di un testo da file e memorizza in una struttura ogni parola,il numero di volte che questa è stata trovata e in quali righe.
Per la lettura delle parole uso:  
int result = fscanf(in, "%255[^ \f\n\r\t\v]%c", buffer, &c);

quindi result = 0 stringa vuota
result = EOF break
quindi result = 2 allora dovrei metterla in una struttura. Il problema è che da dentro buffer non riesco a tirare fuori la parola per poterla salvare. Sto usando una struttura
che è fatta in questo modo:

typedef struct word{
           char* parola;
                 short conto;
                   }recordi;
dove dovrei mettere la parola e quante volte l'ho trovata (conto) e un'altra invece fatta così (una coda concatenata):

typedef struct{
           int key;
               }elemento;

typedef struct coda *coda_pointer;

typedef struct coda{
                    elemento item;
                    coda_pointer link;
                    };
dove in key metterò il numero di riga della parola.
In questo link c'è l'immagine di come dovrebbe essere il risultato.
www.allfreeportal.com/imghost2/thumbs/934760riferiementi.JPG
Ci sto sbattendo la testa da 2 settimane ma proprio non riesco a fare questo stupido progetto! ringrazio in anticipo.


Mery :)
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 19:34
Domenica, 25/07/2010
Ciao!
Ho letto il tuo quesito, ma non posso darti suggerimenti validi.
Come immetti le parole nella struttura? (Posta il codice)


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
mxxforever (Normal User)
Newbie


Messaggi: 7
Iscritto: 25/07/2010

Segnala al moderatore
Postato alle 18:45
Lunedì, 26/07/2010
ti allego il file.. Così vedi il codice ho commentato le funzioni e le ho inserite nel main perchè era impossibile passare la variabile buffer alle funzioni.
Dalla riga  80 in poi cerco di memorizzare la parola nella struttura..

Ultima modifica effettuata da mxxforever il 01/08/2010 alle 18:43


Mery :)
PM Quote
Avatar
mxxforever (Normal User)
Newbie


Messaggi: 7
Iscritto: 25/07/2010

Segnala al moderatore
Postato alle 10:41
Sabato, 07/08/2010
non mi allega il file..

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. #define MAX_CODE 100000
  7.  
  8. #define IS_FULL(ptr) (!(ptr))
  9.  
  10. typedef struct{
  11.                                         int key;
  12.                } elemento;
  13.  
  14. typedef struct coda *coda_pointer;
  15.  
  16. typedef struct coda{
  17.                                                         elemento item;
  18.                      coda_pointer link;
  19.                                                  };
  20.  
  21. typedef struct
  22.                                 {
  23.             char* parola;
  24.             usigned short conta;
  25.                                 }word;
  26.  
  27. coda_pointer davanti[MAX_CODE],dietro[MAX_CODE];
  28.  
  29.  
  30. void analizza ( FILE *in );
  31. void cerca( int *dovesiamo, char buffer, int riga );
  32. void inserisci ( coda_pointer *davanti, coda_pointer *dietro, char buffer, int riga, int *dovesiamo, int k );
  33.  
  34. int main()
  35. {
  36. FILE *in;
  37.  
  38. in = fopen("testo.txt", "r");
  39. if (in == NULL)
  40. {
  41. perror("fopen()");
  42. exit(EXIT_FAILURE);
  43. }
  44. analizza(in);
  45. fclose(in);
  46. fflush(stdin);
  47. getchar();
  48. }
  49.  
  50. void analizza (FILE *in)
  51. {
  52. char c;
  53. int riga = 0;
  54. int dovesono = 0;
  55.  
  56.  
  57. int i ;
  58. for  ( i  = 0 ; i < MAX_CODE ; i++ )
  59.         davanti[i] = NULL;
  60.  
  61. for (;;)
  62. {
  63.         char buffer[256] = {0};
  64.         int result = fscanf(in, "%255[^ \f\n\r\t\v]%c", buffer, &c);
  65.  
  66.         if (result == EOF)
  67.                         break;
  68.         if (result == 2)
  69.         {
  70.                 printf("riga: %d parola: %s\n", riga+1, buffer);
  71.       //cerca(&dovesono,buffer,riga+1);
  72.         {
  73.                                 int k = 0;
  74.             int flag = 0;
  75.                                         for ( k = 0; k < dovesono ; k++ )
  76.                                                 if ( parola [ k ][0] == buffer )
  77.                                                         {
  78.                                 flag = 1;
  79.                            break;
  80.                           }
  81.                             if ( flag == 0 )  // la parola non e' presente quindi la inserisco in coda
  82.  
  83.  
  84.                                 {
  85.         parola[k][0] = buffer ;
  86.       parola[k][1] = 1 ;
  87.                 coda_pointer temp = (coda_pointer)malloc(sizeof(coda));  //  creo un elemento di tipo coda
  88.  
  89.            if ( IS_FULL (temp) )
  90.            {
  91.                         fprint(stderr, " \n Memoria piena " );
  92.         exit(1);
  93.            }
  94.  
  95.            temp->item = riga;
  96.         temp->link = NULL;
  97.  
  98.            if ( *davanti )
  99.                 ( *dietro )->link = temp;
  100.            else
  101.                 *davanti = temp;
  102.            *dietro = temp ;
  103.       *dovesono++;
  104.                                 }
  105.              else    // parola presente nella struttura
  106.  
  107.  
  108.              if ( *davanti < dovesono ) // aggiorno la coda
  109.                                         {
  110.                                 parola[k][1] += 1;
  111.  
  112.                                 coda_pointer temp = (coda_pointer)malloc(sizeof(coda));  //  creo un elemento di tipo coda
  113.  
  114.                         if ( IS_FULL (temp) )
  115.                            {
  116.                                         fprint(stderr, " \n Memoria piena " );
  117.                         exit(1);
  118.                            }
  119.  
  120.                         temp->item = riga;
  121.                         temp->link = NULL;
  122.  
  123.                                 if ( *davanti )
  124.                                         ( *dietro )->link = temp;
  125.                                    else
  126.                                         *davanti = temp;
  127.                            *dietro = temp ;
  128.                                         }
  129.  
  130. }
  131.  
  132.                 if (c == '\n')
  133.                         ++riga;
  134.         }
  135.         else if (result == 0)
  136.         {
  137.                 if (fscanf(in, "%c", &c) == 1 && c == '\n')
  138.                 {
  139.                         printf("riga %d vuota\n", riga+1);
  140.          ++riga;
  141.                 }
  142.         }
  143.         else
  144.         {
  145.                 puts("FINE...");
  146.       break;
  147.         }
  148. }
  149. }



Mery :)
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 11:49
Sabato, 07/08/2010
Ho letto il tup programma, e ho trovato alcune imprecisioni:

1)
Il passaggio del puntatore a file in una funzione, va fatta necessariamente per indirizzo.

Nella dichiarazione dovrai dichiarare:
Codice sorgente - presumibilmente C/C++

  1. void analizza ( FILE **in );



Alla chiamata:

Codice sorgente - presumibilmente Plain Text

  1. analizza(&in);



Per le operazioni di lettura:

Codice sorgente - presumibilmente C/C++

  1. int result = fscanf(*in, "%255[^ \f\n\r\t\v]%s", &buffer);



2)
La struttura word è solo un tipo di dato, non una variabile.
Nel programma, mancala dichiarazione di una variabile di quel tipo.

A mio avviso, dovrai dichiarare nel main:

Codice sorgente - presumibilmente Plain Text

  1. word p={.parola="parola", .conta=0}; // "parola" è appunto il vocabolo da cercare



La funzione analizza diventa:
Codice sorgente - presumibilmente C/C++

  1. void analizza ( FILE **in, word *p );



Non capisco bene la modalità di confronto; dovresti scrivere

Codice sorgente - presumibilmente C/C++

  1. if (! strcmp(p->parola, buffer))
  2.  {
  3.     p->conta++; // incremento del contatore
  4.     ...
  5.  }



3)

Attenzione a usare la funzione malloc in un ciclo!

Nel tuo programma, ad ogni ciclo viene istanziata una nuova struttura in memoria, e perso il riferimento a quella precedentemente istanziata.

Ultima modifica effettuata da Poggi Marco il 07/08/2010 alle 12:03


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
mxxforever (Normal User)
Newbie


Messaggi: 7
Iscritto: 25/07/2010

Segnala al moderatore
Postato alle 11:08
Domenica, 08/08/2010
forse non mi sono spiegata bene.
Il mio problema è memorizzare il contenuto della variabile buffer su una struttura, una stringa o una qualunque variabile (non riesco a copiare quello che c'è li dentro lo posso solo visualizzare )  
Sinceramente le altre cose che mi hai scritto non le ho capite tanto.. tipo  
Codice sorgente - presumibilmente C/C++

  1. void analizza ( file **in );

perchè metti due vole * ? Basta una sola volta quando è un puntatore o no?

Codice sorgente - presumibilmente C/C++

  1. int result = fscanf(*in, "%255[^ \f\n\r\t\v]%s", &buffer);


funziona bene senza usare  *in ma solo con in, sono partita da un programma che leggeva ogni singola parola e la mostrava a video ed era scritto con quel codice.

questo è il link del pdf con le spiegazioni sul programma che devo realizzare, così magari si capisce meglio quello che devo fare.
http://www.megaupload.com/?d=WLDLH00G

Ultima modifica effettuata da mxxforever il 08/08/2010 alle 11:24


Mery :)
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 12:09
Domenica, 08/08/2010
Testo quotato

Postato originariamente da mxxforever:

forse non mi sono spiegata bene.
Il mio problema è memorizzare il contenuto della variabile buffer su una struttura, una stringa o una qualunque variabile (non riesco a copiare quello che c'è li dentro lo posso solo visualizzare )  
Sinceramente le altre cose che mi hai scritto non le ho capite tanto.. tipo  
Codice sorgente - presumibilmente C/C++

  1. void analizza ( file **in );

perchè metti due vole * ? Basta una sola volta quando è un puntatore o no?

Codice sorgente - presumibilmente C/C++

  1. int result = fscanf(*in, "%255[^ \f\n\r\t\v]%s", &buffer);


funziona bene senza usare  *in ma solo con in, sono partita da un programma che leggeva ogni singola parola e la mostrava a video ed era scritto con quel codice.

questo è il link del pdf con le spiegazioni sul programma che devo realizzare, così magari si capisce meglio quello che devo fare.
http://www.megaupload.com/?d=WLDLH00G



Per utilizzare una struttura, prima bisogna istanziarla, non è possibile utilizzare direttamente i membri.
Per analogia, non è possibile memorizzare un numero direttamente in un tipo int, in questo modo:

Codice sorgente - presumibilmente C/C++

  1. ...
  2.   int = 5;
  3.   ...



La procedura corretta è:
Codice sorgente - presumibilmente C/C++

  1. ...
  2.   int numero = 5;
  3.   word p;  // ora posso utilizzare la struttura tramite la variabile p
  4.   ...



Per quanto riguarda la funzione analizza, ho messo due asterischi per indicare il pasaggio di un puntatore a un puntatore.
Nel c, i puntatori a filevanno passati per indirizzo, altrimenti viene generato un nuovo stream indipendente dall' originale.



Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 12:11
Domenica, 08/08/2010



Ultima modifica effettuata da Poggi Marco il 08/08/2010 alle 12:13


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
mxxforever (Normal User)
Newbie


Messaggi: 7
Iscritto: 25/07/2010

Segnala al moderatore
Postato alle 12:19
Domenica, 08/08/2010
ho capito quindi cambiando la struttura in
Codice sorgente - presumibilmente C/C++

  1. typedef struct p
  2.         {
  3.             char* parola;
  4.             usigned short conta;
  5.         }word;



posso usare direttamente word perchè è una struttura di tipo p ?


Mery :)
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo