Oppure

Loading
25/07/10 12:57
mxxforever
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.
allfreeportal.com/imghost2/thumbs/…
Ci sto sbattendo la testa da 2 settimane ma proprio non riesco a fare questo stupido progetto! ringrazio in anticipo.
aaa
25/07/10 17:34
Poggi Marco
Ciao!
Ho letto il tuo quesito, ma non posso darti suggerimenti validi.
Come immetti le parole nella struttura? (Posta il codice)
aaa
26/07/10 16:45
mxxforever
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 01/08/10 16:43
aaa
07/08/10 8:41
mxxforever
non mi allega il file..

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

#define MAX_CODE 100000

#define IS_FULL(ptr) (!(ptr))

typedef struct{
					int key;
               } elemento;

typedef struct coda *coda_pointer;

typedef struct coda{
							elemento item;
                     coda_pointer link;
						 };

typedef struct
				{
            char* parola;
            usigned short conta;
				}word;

coda_pointer davanti[MAX_CODE],dietro[MAX_CODE];


void analizza ( FILE *in );
void cerca( int *dovesiamo, char buffer, int riga );
void inserisci ( coda_pointer *davanti, coda_pointer *dietro, char buffer, int riga, int *dovesiamo, int k );

int main()
{
FILE *in;

in = fopen("testo.txt", "r");
if (in == NULL)
{
perror("fopen()");
exit(EXIT_FAILURE);
}
analizza(in);
fclose(in);
fflush(stdin);
getchar();
}

void analizza (FILE *in)
{
char c;
int riga = 0;
int dovesono = 0;


int i ;
for  ( i  = 0 ; i < MAX_CODE ; i++ )
	davanti[i] = NULL;

for (;;)
{
	char buffer[256] = {0};
	int result = fscanf(in, "%255[^ \f\n\r\t\v]%c", buffer, &c);

	if (result == EOF)
			break;
	if (result == 2)
	{
		printf("riga: %d parola: %s\n", riga+1, buffer);
      //cerca(&dovesono,buffer,riga+1);
      	{
				int k = 0;
            int flag = 0;
					for ( k = 0; k < dovesono ; k++ )
					   	if ( parola [ k ][0] == buffer )
						        {
                          	flag = 1;
                           break;
                          }
			    if ( flag == 0 )  // la parola non e' presente quindi la inserisco in coda


   				{
   	parola[k][0] = buffer ;
      parola[k][1] = 1 ;
		coda_pointer temp = (coda_pointer)malloc(sizeof(coda));  //  creo un elemento di tipo coda

	   if ( IS_FULL (temp) )
	   {
			fprint(stderr, " \n Memoria piena " );
      	exit(1);
	   }

	   temp->item = riga;
   	temp->link = NULL;

	   if ( *davanti )
   		( *dietro )->link = temp;
	   else
   		*davanti = temp;
	   *dietro = temp ;
      *dovesono++;
				}
             else    // parola presente nella struttura


             if ( *davanti < dovesono ) // aggiorno la coda
					{
			   	parola[k][1] += 1;

				coda_pointer temp = (coda_pointer)malloc(sizeof(coda));  //  creo un elemento di tipo coda

	   		if ( IS_FULL (temp) )
			   {
					fprint(stderr, " \n Memoria piena " );
      			exit(1);
			   }

	   		temp->item = riga;
		   	temp->link = NULL;

	   			if ( *davanti )
			   		( *dietro )->link = temp;
				   else
			   		*davanti = temp;
			   *dietro = temp ;
   					}

}

		if (c == '\n')
			++riga;
	}
	else if (result == 0)
	{
		if (fscanf(in, "%c", &c) == 1 && c == '\n')
		{
			printf("riga %d vuota\n", riga+1);
         ++riga;
		}
	}
	else
	{
		puts("FINE...");
      break;
	}
}
}
aaa
07/08/10 9:49
Poggi Marco
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:
void analizza ( FILE **in );


Alla chiamata:

analizza(&in);


Per le operazioni di lettura:

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:

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


La funzione analizza diventa:
void analizza ( FILE **in, word *p ); 


Non capisco bene la modalità di confronto; dovresti scrivere

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


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 07/08/10 10:03
aaa
08/08/10 9:08
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
void analizza ( file **in ); 
perchè metti due vole * ? Basta una sola volta quando è un puntatore o no?

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.
megaupload.com/
Ultima modifica effettuata da mxxforever 08/08/10 9:24
aaa
08/08/10 10:09
Poggi Marco
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
void analizza ( file **in ); 
perchè metti due vole * ? Basta una sola volta quando è un puntatore o no?

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.
megaupload.com/


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:

  ...
  int = 5;
  ...


La procedura corretta è:
  ...
  int numero = 5;
  word p;  // ora posso utilizzare la struttura tramite la variabile p
  ...  


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.

aaa
08/08/10 10:11
Poggi Marco


Ultima modifica effettuata da Poggi Marco 08/08/10 10:13
aaa