tenbota87
10-02-2011, 16:35
Salve a tutti!
Ho un problema..
In questo codice io devo leggere un file contenente parole delimitate da un numero variabile di spazi e devo creare un file contenente le parole e la loro relativa frequenza, in modo decrescente. La lettura da file dovrebbe avvenire in modo corretto, il problema sorge nell'ordinamento della lista e nella conseguente stampa su file.
Spero che ci sia qualche buon anima che mi possa rispondere e aiutare!
Grazie in anticipo..
#include <stdio.h> //Direttive al pre processore che ci permettono di includere
#include <string.h> //gli haeder file,relativi a librerie standar.
#include <stdlib.h>
#include <limits.h>
#include <assert.h>
// definizione della funzione ASSERT() con stampa di un messaggio di errore
#define ASSERT( condizionedaverificare, cosafare ) { if ( !(condizionedaverificare) ) { printf cosafare; printf("\n"); assert( condizionedaverificare ); } }
struct lista{ //Dichiarazione della lista usata dalla funzione aggiuntiva
char parola[257]; //Dichiarazione di un array di lunghezza massima 1024 adibito a contenere la parola
int frequenza; //Dichiarazione di una varibile adibita a contenere la frequenza della parola
struct lista *next; //Dichiarazione di un puntatore per lo spostamento all'interno della lista
};
int main(int argc, char *argv[])
{
char *nomeDelFile=NULL; //puntatore al nome del file da comprimere o decomprimere
char *centoParole=NULL;
char *pra=NULL;
FILE *fileTesto=NULL;
FILE *fpw=NULL ;
int contaLettere=0;
int numero_parole=0;
int massimo=0;
char bufferLettura[256];
struct lista *nuovo=NULL;
struct lista *testa=NULL;
struct lista *temp=NULL;
struct lista *prev=NULL;
struct lista *canc=NULL;
if(argc!=2) //controllo sul numero di parametri per far partire il programma che devono essere: <nome programma> <nome file>
{
printf("\nErrore!Indicare il nome del file da comprimere o da decomprimere\n");
exit(1);
}
nomeDelFile=argv[1]; //copio il contenuto di argv[1] che contiene il nome del file da comprimere/decomprimere
centoParole = (char*)malloc(sizeof(char)*(strlen(nomeDelFile)+7));
strncpy(centoParole,nomeDelFile,strlen(nomeDelFile));
strncat(centoParole,".world\0",7);
fileTesto=fopen(nomeDelFile,"r"); //apertura del file di testo in modalità lettura
fpw=fopen(centoParole,"w"); //apertura del file di testa in cui devo andare a scrivere
assert(fpw != NULL);
while(!feof(fileTesto))
{
//trovato=0;
contaLettere=0; //Indicizzazione a 0 della variabile i
pra = (char*)malloc( 256 * sizeof(char));
memset(pra,0,256 * sizeof(char));
fscanf(fileTesto,"%s", pra);
strcpy(bufferLettura,pra);
//printf("\n Parola: %s",bufferLettura);
contaLettere=strlen(bufferLettura);
free(pra);
if(contaLettere<256)
{
bufferLettura[contaLettere]='\0';
}
else
{
bufferLettura[0]='\0';
}
if(bufferLettura[0]!='\0') //guardare soluzioni alternative per parole maggiori di 256 caratteri
{ //printf("\n 10 \n");
prev = NULL;
temp=testa;
while((temp != NULL) && (strcmp(bufferLettura,temp->parola) != 0)){
prev = temp;
temp = temp->next; //Incremento il puntatore per avanzare nella scansione della lista
}
if (temp == NULL)
{
// printf("\n 17 dentro\n");
nuovo=(struct lista*)malloc(sizeof(struct lista)); //Allocazione dinamica della memoria di una nuova cella della lista tramite la funzione malloc
strncpy(nuovo->parola,bufferLettura,contaLettere);
// printf("\n 18 dentro\n");
nuovo->frequenza=1; //Impostazione della frequenza della parola a 1
nuovo->next = NULL;
if (testa != NULL)
prev->next = nuovo;
else testa = nuovo;
// printf("\n 18 dentro\n");
// printf("\nPrima Parola in lista:%s \n",nuovo->parola);
// printf("\n 18 dentro\n");
// printf("\nFrequenza in lista:%d \n",nuovo->frequenza);
}
else temp->frequenza++;
}
}
temp=testa;
if(testa==NULL)
{
fclose(fpw);
exit(0);
}
else
{
while(temp != NULL && numero_parole <= 100 )
{
massimo=0;
while(temp != NULL) //ciclo per trovare il massimo
{
if(temp->frequenza > massimo)
{
massimo=temp->frequenza;
}
temp=temp->next;
}
temp=testa;
while(temp != NULL)
{
if(temp->frequenza == massimo)
{
fprintf(fpw,"%d %s \r\n",temp->frequenza,temp->parola);
numero_parole++;
prev->next=temp->next;
canc=temp;
temp=temp->next;
free(canc);
}
else
{
prev=temp;
temp=temp->next;
}
}
}
}
fclose(fileTesto);
fclose(fpw);
return 0;
}
Ho un problema..
In questo codice io devo leggere un file contenente parole delimitate da un numero variabile di spazi e devo creare un file contenente le parole e la loro relativa frequenza, in modo decrescente. La lettura da file dovrebbe avvenire in modo corretto, il problema sorge nell'ordinamento della lista e nella conseguente stampa su file.
Spero che ci sia qualche buon anima che mi possa rispondere e aiutare!
Grazie in anticipo..
#include <stdio.h> //Direttive al pre processore che ci permettono di includere
#include <string.h> //gli haeder file,relativi a librerie standar.
#include <stdlib.h>
#include <limits.h>
#include <assert.h>
// definizione della funzione ASSERT() con stampa di un messaggio di errore
#define ASSERT( condizionedaverificare, cosafare ) { if ( !(condizionedaverificare) ) { printf cosafare; printf("\n"); assert( condizionedaverificare ); } }
struct lista{ //Dichiarazione della lista usata dalla funzione aggiuntiva
char parola[257]; //Dichiarazione di un array di lunghezza massima 1024 adibito a contenere la parola
int frequenza; //Dichiarazione di una varibile adibita a contenere la frequenza della parola
struct lista *next; //Dichiarazione di un puntatore per lo spostamento all'interno della lista
};
int main(int argc, char *argv[])
{
char *nomeDelFile=NULL; //puntatore al nome del file da comprimere o decomprimere
char *centoParole=NULL;
char *pra=NULL;
FILE *fileTesto=NULL;
FILE *fpw=NULL ;
int contaLettere=0;
int numero_parole=0;
int massimo=0;
char bufferLettura[256];
struct lista *nuovo=NULL;
struct lista *testa=NULL;
struct lista *temp=NULL;
struct lista *prev=NULL;
struct lista *canc=NULL;
if(argc!=2) //controllo sul numero di parametri per far partire il programma che devono essere: <nome programma> <nome file>
{
printf("\nErrore!Indicare il nome del file da comprimere o da decomprimere\n");
exit(1);
}
nomeDelFile=argv[1]; //copio il contenuto di argv[1] che contiene il nome del file da comprimere/decomprimere
centoParole = (char*)malloc(sizeof(char)*(strlen(nomeDelFile)+7));
strncpy(centoParole,nomeDelFile,strlen(nomeDelFile));
strncat(centoParole,".world\0",7);
fileTesto=fopen(nomeDelFile,"r"); //apertura del file di testo in modalità lettura
fpw=fopen(centoParole,"w"); //apertura del file di testa in cui devo andare a scrivere
assert(fpw != NULL);
while(!feof(fileTesto))
{
//trovato=0;
contaLettere=0; //Indicizzazione a 0 della variabile i
pra = (char*)malloc( 256 * sizeof(char));
memset(pra,0,256 * sizeof(char));
fscanf(fileTesto,"%s", pra);
strcpy(bufferLettura,pra);
//printf("\n Parola: %s",bufferLettura);
contaLettere=strlen(bufferLettura);
free(pra);
if(contaLettere<256)
{
bufferLettura[contaLettere]='\0';
}
else
{
bufferLettura[0]='\0';
}
if(bufferLettura[0]!='\0') //guardare soluzioni alternative per parole maggiori di 256 caratteri
{ //printf("\n 10 \n");
prev = NULL;
temp=testa;
while((temp != NULL) && (strcmp(bufferLettura,temp->parola) != 0)){
prev = temp;
temp = temp->next; //Incremento il puntatore per avanzare nella scansione della lista
}
if (temp == NULL)
{
// printf("\n 17 dentro\n");
nuovo=(struct lista*)malloc(sizeof(struct lista)); //Allocazione dinamica della memoria di una nuova cella della lista tramite la funzione malloc
strncpy(nuovo->parola,bufferLettura,contaLettere);
// printf("\n 18 dentro\n");
nuovo->frequenza=1; //Impostazione della frequenza della parola a 1
nuovo->next = NULL;
if (testa != NULL)
prev->next = nuovo;
else testa = nuovo;
// printf("\n 18 dentro\n");
// printf("\nPrima Parola in lista:%s \n",nuovo->parola);
// printf("\n 18 dentro\n");
// printf("\nFrequenza in lista:%d \n",nuovo->frequenza);
}
else temp->frequenza++;
}
}
temp=testa;
if(testa==NULL)
{
fclose(fpw);
exit(0);
}
else
{
while(temp != NULL && numero_parole <= 100 )
{
massimo=0;
while(temp != NULL) //ciclo per trovare il massimo
{
if(temp->frequenza > massimo)
{
massimo=temp->frequenza;
}
temp=temp->next;
}
temp=testa;
while(temp != NULL)
{
if(temp->frequenza == massimo)
{
fprintf(fpw,"%d %s \r\n",temp->frequenza,temp->parola);
numero_parole++;
prev->next=temp->next;
canc=temp;
temp=temp->next;
free(canc);
}
else
{
prev=temp;
temp=temp->next;
}
}
}
}
fclose(fileTesto);
fclose(fpw);
return 0;
}