PDA

View Full Version : Loop infinito in feof


3nigma666
24-02-2005, 21:18
devo leggere dei valori da file,il file è cosi strutturato:

quicksort
10 0.000000123 0.8000 956456
heapsort
10 0.000000345 0.987 102567

io devo leggere riga per riga i valori e memorizzarli in una variabile.
il codice deve essere ottimizzato ancora,piu ke altor mi interessava vedere se leggeva i valori e il ciclo fino alla fine del file funzionava,e invece la parte:

do{
fscanf(file,"%d %.15f %.15f %d",lung,media,campione,ripe);
std::cout<<lung<<media<<campione<<ripe;
}while (!feof(file));
mi va in loop infinito! perke?
vi allego il codice della funzione



void istogramma (int input,char * buffer,FILE *file){
std::cout<<"Lunghezza vettore: "<<input<<std::endl;
std::cout<<std::endl;
std::cout<<"Scala 1000 : 1. I valori vanno da 0 a 50 secondi"<<std::endl;
std::cout<<"QUICKSORT: ";
file = fopen("QS.txt", "r");
if( file==NULL ) {
std::cout<<"Errore in apertura del file"<<std::endl;
exit(1);
}

float tempo_letto= 0.800;
//scala
float media,campione;
int lung,ripe;

do{
fscanf(file,"%d %.15f %.15f %d",lung,media,campione,ripe);
//provo a stampare per vedere se assegna correttamente i valori
std::cout<<lung<<media<<campione<<ripe;
}while (!feof(file));

for(float k=0;k<=((50000/tempo_letto)/1000);k++)
std::cout<<"#";
std::cout<<std::endl;
int n;
std::cin>>n;
}

Ziosilvio
25-02-2005, 12:10
Se non riesce a leggere una stringa che ha esattamente il formato espresso dal suo secondo argomento, fscanf rimette a posto l'ultimo carattere che ha letto.
Quindi, se il file termina con un newline e la stringa di formato no, la fine del file può non essere mai raggiunta.
Secondo me puoi risolvere il problema sfruttando il fatto che fscanf restituisce in output il numero di conversioni effettuate:
while (fscanf(file,"%d %.15f %.15f %d",lung,media,campione,ripe)==4)
std::cout<<lung<<media<<campione<<ripe;
Una domanda: perché mescoli input/output stile C e stile C++?

3nigma666
26-02-2005, 13:54
molto semplicemente perke trovo molto piu comodo scrivere n standard output (monitor) con il cout piu immediato ke con printf e di conseguenza preferisco per metodo di comodita.tutto qua uso fprintf perke mi risulta piu comodo ,è solo questione di comodita.
GRazie per l idea ;)

3nigma666
27-02-2005, 19:14
conitnua ad andare in loop. ho tolto anke i caratteri di newline dal file .txt ke deve leggere ma continua a loooopareeeeeeeee !! help perke .. il txt è cosi:



QUICKSORT
10 0.000001234 0.324224 543634
HEAPSORT
10 0.0004523 0.523523 5435352
INSERTIONSORT
10 0.000053552 0.45352 543524
ecc...

Il pezzo di codice ke legge è :

while (!feof(file)){
fscanf(file,"%d %.4f %.4f %d",lung,media,campione,ripe)
std::cout<<lung<<media<<campione<<ripe;
}


mi luppa ho provato a fare cosi:

while (fscanf(file,"%d %.4f %.4f %d",lung,media,campione,ripe)==4)
std::cout<<lung<<media<<campione<<ripe;
int n;

ma mi luppa lo stesso