PDA

Visualizza la versione completa : [C]-Problema con la scrittura su file


loki2009
17-10-2009, 11:11
Salve ragazzi,
sono nuovo del forum e non molto esperto di programmazione C; vado subito al dunque:
ho scritto un programma in C che legge da un file .txt e, per ogni riga letta dal file di input, fa un'operazione e scrive il risultato su un file di output sempre di tipo .txt.

Il programma funziona correttamente, ma, indipendentemente dal numero di righe del file di input, sul file di output non vengono mai scritte più di 508 righe. Non riesco a capire il perchè. Vi allego il codice. Spero che possiate darmi una mano. Ringrazio tutti anticipatamente.

CODICE:
_______________________
#include <stdio.h>
#include <stdlib.h>

#define kFileDaLeggere "input.txt"
#define kFileDaScrivere "output.txt"
#define kLunghezzaMaxStringa 400

#define kErroreIO -1
#define kErroreMemoria -2
#define kNessunErrore 0

char *nextLine;
char *contributo;
int numeroAutori;

int main (void);
int LeggiProssimaRiga(void);
int ScriviContributo(void);
int CalcolaContributo(void);
int CalcolaContributoIntraM(void);
int CalcolaContributoExtraM(void);
int CalcolaContributoNormal(void);
void substring(char* dest, char *source, int i_base, int i_dim);

int main (void)
{
int erroreAperturaFile;

erroreAperturaFile=LeggiProssimaRiga();
if(erroreAperturaFile)
return erroreAperturaFile;
printf("Elaborazione conclusa.\n\n");
return kNessunErrore;
}

int LeggiProssimaRiga(void)
{
FILE *ingresso;
int erroreAperturaFile;

printf("\n\nLettura dal file %s\n\n\n",kFileDaLeggere);
ingresso=fopen(kFileDaLeggere,"r");
if(ingresso==NULL)
return kErroreIO;

nextLine=calloc(kLunghezzaMaxStringa,sizeof(char)) ;
if(nextLine==NULL)
return kErroreMemoria;

contributo=calloc(kLunghezzaMaxStringa,sizeof(char ));
if(contributo==NULL)
return kErroreMemoria;
printf("Elaborazione in corso...\n\n\n");
while (!feof(ingresso)){
fscanf(ingresso,"%s",nextLine);
//printf("Stringa: %s\n",nextLine);
//printf("\n");
CalcolaContributo();
erroreAperturaFile=ScriviContributo();
if(erroreAperturaFile)
return erroreAperturaFile;
}

fclose(ingresso);

return kNessunErrore;
}

int ScriviContributo(void)
{
FILE *uscita;

uscita=fopen(kFileDaScrivere,"a");
if(uscita==NULL)
return kErroreIO;
fprintf(uscita,"%s\n",contributo);

return kNessunErrore;
}

int CalcolaContributo(void){

char *numeroAutoriString;
numeroAutoriString=calloc(kLunghezzaMaxStringa,siz eof(char));
if(numeroAutoriString==NULL)
return kErroreMemoria;

substring(numeroAutoriString,nextLine,2,(int)strle n(nextLine));
//printf("Stringa: %s\n",numeroAutoriString);
numeroAutori=atoi(numeroAutoriString);
//printf("Intero: %u\n",numeroAutori);
if(nextLine[0]=='N') CalcolaContributoNormal();
else if(numeroAutori==1) sprintf(contributo,"1");
else if(numeroAutori==2) sprintf(contributo,"0.500; 0.500");
else if(numeroAutori==3) sprintf(contributo,"0.400; 0.200; 0.400");
else if(numeroAutori>3 && nextLine[0]=='I')CalcolaContributoIntraM();
else if(numeroAutori>3 && nextLine[0]=='E')CalcolaContributoExtraM();
}

int CalcolaContributoIntraM(void){
sprintf(contributo,"0.400; ");

double contributiIntermedi=(0.2)/(numeroAutori-2);
//printf("Double:%f\n",contributiIntermedi);

char *temp;
temp=calloc(kLunghezzaMaxStringa,sizeof(char));
if(temp==NULL)
return kErroreMemoria;

sprintf(temp,"%f",contributiIntermedi);
//printf("temp:%s\n",temp);

char *contributiIntermediString;
contributiIntermediString=calloc(kLunghezzaMaxStri nga,sizeof(char));
if(contributiIntermediString==NULL)
return kErroreMemoria;

substring(contributiIntermediString,temp,0,5);
strcat(contributiIntermediString,"; ");
//printf("String:%s\n",contributiIntermediString);

int i=0;
for(i;i<numeroAutori-2;i++){
strcat(contributo,contributiIntermediString);
//printf("Contributo:%s\n",contributo);
}
strcat(contributo,"0.400");
//printf("Contributo:%s\n",contributo);
}

int CalcolaContributoExtraM(void){
sprintf(contributo,"0.300; 0.150; ");

double contributiIntermedi=(0.1)/(numeroAutori-4);
//printf("Double:%f\n",contributiIntermedi);

char *temp;
temp=calloc(kLunghezzaMaxStringa,sizeof(char));
if(temp==NULL)
return kErroreMemoria;

sprintf(temp,"%f",contributiIntermedi);
//printf("temp:%s\n",temp);

char *contributiIntermediString;
contributiIntermediString=calloc(kLunghezzaMaxStri nga,sizeof(char));
if(contributiIntermediString==NULL)
return kErroreMemoria;

substring(contributiIntermediString,temp,0,5);
strcat(contributiIntermediString,"; ");
//printf("String:%s\n",contributiIntermediString);

int i=0;
for(i;i<numeroAutori-4;i++){
strcat(contributo,contributiIntermediString);
//printf("Contributo:%s\n",contributo);
}
strcat(contributo,"0.150; 0.300");
//printf("Contributo:%s\n",contributo);
}

int CalcolaContributoNormal(void){
//"pulisco" la variabile contributo
sprintf(contributo,"");

double contributi=(1.0)/(numeroAutori);
//printf("Double:%f\n",contributi);

char *temp;
temp=calloc(kLunghezzaMaxStringa,sizeof(char));
if(temp==NULL)
return kErroreMemoria;

sprintf(temp,"%f",contributi);
//printf("temp:%s\n",temp);

char *contributiString;
contributiString=calloc(kLunghezzaMaxStringa,sizeo f(char));
if(contributiString==NULL)
return kErroreMemoria;

substring(contributiString,temp,0,5);
strcat(contributiString,"; ");
//printf("String:%s\n",contributiIntermediString);

int i=0;
for(i;i<numeroAutori;i++){
strcat(contributo,contributiString);
//printf("Contributo:%s\n",contributo);
}
substring(contributo,contributo,0,(int)strlen(cont ributo)-2);
}

void substring(char* dest, char *source, int i_base, int i_dim){
int i = 0;
for (i=i_base; i<i_dim; i++){
dest[i-i_base] = source[i];
}
//Aggiungo carattere di terminazione:
dest[i]='\0';

return;
}

_______________________

oregon
17-10-2009, 11:28
E' importante sapere cosa c'e' nel file in input ...

P.S. Modifica il post racchiudendo il codice tra i tag CODE

loki2009
17-10-2009, 12:43
Ho provato a modificare il post, ma mi dice che siccome sono passati più di 60 minuti devo contattare l'amministratore.
Cmq un esempio di file input è:


I-4
I-1
E-2
I-3
N-4
E-11
I-7
E-5

ed il corrispondente esempio di output è:


0.400; 0.100; 0.100; 0.400
1
0.500; 0.500
0.400; 0.200; 0.400
0.250; 0.250; 0.250; 0.250
0.300; 0.150; 0.014; 0.014; 0.014; 0.014; 0.014; 0.014; 0.014; 0.150; 0.300
0.400; 0.040; 0.040; 0.040; 0.040; 0.040; 0.400
0.300; 0.150; 0.100; 0.150; 0.300

Così il programma funziona, ma, se metto nel file di input un numero di righe maggiore di 508, il file di output non contiene tutti i rispettivi risultati bensì solamente i primi 508.

oregon
17-10-2009, 12:46
Sì, ma tu dici che non vengono mai scritte piu' di 508 righe ... quello che si deve capire e' se e' un problema del tuo codice o del file di input.

Quante righe ci sono nel file di input?

Quante righe devono essere generate nell'output per ogni riga di input?

loki2009
17-10-2009, 12:51
Il programma deve funzionare con un numero molto grande di righe di input e generare per ogni riga di input una riga di output; io l'ho provato con 2500 righe di input e mi ritrovo l'output solamente per le prime 508. Spero di essere stato chiaro.

oregon
17-10-2009, 12:54
Originariamente inviato da loki2009
Il programma deve funzionare con un numero molto grande di righe di input e generare per ogni riga di input una riga di output; io l'ho provato con 2500 righe di input e mi ritrovo l'output solamente per le prime 508. Spero di essere stato chiaro.

Ok ... quindi, per fare una prova che abbia un senso, bisogna avere il tuo file da 2500 righe e provarlo con il tuo codice, perche', in caso contrario, il problema potrebbe non manifestarsi.

Se zippi il file dati e lo rendi disponibile, si puo' provare.

loki2009
17-10-2009, 13:02
Le righe sono tutte del tipo di quelle che ho postato. Io non ho a disposizione il file di input vero e proprio per il quale il programma deve funzionare. Ho fatto una prova ripetendo le stesse righe per più volte. Ecco un link per scaricare il file di prova che ho fatto:

http://italianhost.org/filehost/download.php?file=714014

oregon
17-10-2009, 13:22
Non hai notato che la chiamata

erroreAperturaFile=ScriviContributo();

ad un certo punto, restituisce un errore?

Se guardi la funzione ScriviContributo, c'e' l'apertura del file in uscita (in append), ma la chiusura non avviene mai ... e dopo 500 volte che lo apri senza chiuderlo, e' ovvio che avrai un errore.

loki2009
17-10-2009, 13:42
Acci.. Hai ragionissima.. Che stupido!! Ho aggiunto l'istruzione:

fclose(uscita);
alla fine del metodo ScriviContributo ed ora funziona.
Ti ringrazio per il tuo prezioso aiuto. Sei stato gentilissimo. Grazie ancora. Ciao.

oregon
17-10-2009, 13:45
Originariamente inviato da loki2009
Acci.. Hai ragionissima.. Che stupido!! Ho aggiunto l'istruzione:

fclose(uscita);
alla fine del metodo ScriviContributo ed ora funziona.
Ti ringrazio per il tuo prezioso aiuto. Sei stato gentilissimo. Grazie ancora. Ciao.

Di nulla ... ma se per ogni riga del file di input, apri e chiudi il file di output, il programma sarà lentissimo.

Modifica il codice in modo da aprire il file di output una sola volta all'inizio e chiuderlo alla fine nel main (come fai per il file di input).

Alla funzione ScriviContributo passi il puntatore al FILE di output.

Loading