PDA

Visualizza la versione completa : [C++] scorrere file attraverso puntatore


No_Rules
30-08-2010, 15:40
Ragazzi ho un piccolo problema con una funzione che deve mostrare un oggetto con più prestiti, confrontandolo con dei record presenti in un file.
Siccome può capitare che due o più record abbiano la stessa quantità di prestiti, la funzione cerca prima il più grande e poi lo riconfronta stampando tutti quelli che hanno lo stesso numero.
Forse con il codice riesco a spiegarmi meglio:


void piu_pres(){

libro current;
libro max;

system("CLS");
ifstream lib("Libri", ios::in | ios::binary);

if(!lib){
cout<<endl<<"Impossibile aprire il file";
abort();
}

lib.read((char*)&current, sizeof(libro));

max=current;

while(!lib.eof()){
if(max.get_prest() < current.get_prest())
max=current;
lib.read((char*)&current, sizeof(libro));
}
lib.seekg(ios::beg);

lib.read((char*)&current, sizeof(libro));

cout<<"Il/i lettore/i con piu' prestiti e'/sono:"<< endl << endl;

while(!lib.eof()){
cout<<endl;
if(max.get_prest() == current.get_prest())
current.get_libro();
lib.read((char*)&current, sizeof(libro));
}

in.close();

lib.close();
system("pause");

}


I metodi della classe funzionano e sono testati, get_libro() serve a stampare a video la scheda del libro.
In pratica su una lista di libri si deve stampare quello o quelli con più prestiti.
Dopo la prima lettura deve effettuarne un altra, il puntatore messo in ios::beg mostra la posizione -1, ma poi la read() non legge e non capisco perché.

Vi chiedo un consiglio o magari se conoscete un algoritmo migliore...
Vi ringrazio anticipatamente

shodan
30-08-2010, 18:47
...e non capisco perché.

Perché una volta settato il bit di eof non è sufficiente riportare il file pointer all'inizio per resettarlo. Usa lib.clear() per farlo.



Vi chiedo un consiglio o magari se conoscete un algoritmo migliore...


Meglio caricare tutti i record in memoria, invece di spostare il file pointer.
L'esecuzione dell'algoritmo risulta più veloce.

No_Rules
30-08-2010, 20:27
grazie mille ho risolto con clear()... :D

Loading