Newsgroup: it.comp.lang.c++
Titolo: lettura da file binari

Ho un file binario al cui interno sono memorizzati dei numeri interi. Come
posso leggere, ad esempio, il solo 'record' 18 senza aprire interamente il
file?
(in C++ standard)
Grazie in anticipo,
Vale

 wrote :
| Ho un file binario al cui interno sono memorizzati dei numeri interi.
Come
| posso leggere, ad esempio, il solo 'record' 18 senza aprire interamente
il
| file?
Comunque il file lo devi aprire, e vista la lentezza degli HD rispetti alla
memoria, per ottimizzare in velocita', ti copnviene leggerlo tutto, e
memorizzare i valori in un vector<int>, dopodiche' leggi il 18° elemento
con
#include <vector>
#include <iostream>
std::vector<int> numeri;
std::ifstream il_file;
int num;
//  qui leggi il file
while(!il_file.eof()){
    il_file >> num;
    numeri.push_back(num);
}
int il_18_elem = numeri[18];
Alla fine scrivi di nuovo il vector in chiusura.
Prova cosi', se hai ancora problemi, posta una versione del tuo codice.

     il_file >> num;
Ho dei dubbi sulla lettura di un numero intero in questo modo.
Se il file è binario, suppongo che gli interi siano scritti in modo sequenziale senza
separatori.
Ad esempio   123-8743-3435...     // il - c'è solo per chiarezza
Quindi quando tenti di leggere il primo numero questi sarà
12387433435... fino a raggiungere la fine del file.
Comunque tutto dipende da come sono stati scritti gli interi.
Per risparmiare spazio, visto che un intero a 32 bit occupa 4 byte,
io scriverei nel file questi quattro byte che compongono l'intero
(risparmiando molto spazio: scrivendo un interno con la formattazione
ogni cifra prende un byte).
Quindi per una rilettura basterà implementare una classe che mappi il file.
Ad esempio se si richiede il 18-esimo intero basta fare
seekg(18 * 4, ios_base::beg)
quindi leggere i quattro byte e ricostruire l'intero.
Manlio Perillo

 wrote :
| Ho dei dubbi sulla lettura di un numero intero in questo modo.
| Se il file è binario, [...]
Non sapendo come e' questo file, il codice e' per forza generico... Penso
che comunque Valeio sia in grado di implementare la giusta versione.
|  Comunque tutto dipende da come sono stati scritti gli interi.
Ovviamente :)
In qualche modo li dovra' pur leggere, e il codice era solo
esemplificativo.
| Quindi per una rilettura basterà implementare una classe che mappi il
file.
| Ad esempio se si richiede il 18-esimo intero basta fare
| seekg(18 * 4, ios_base::beg)
| quindi leggere i quattro byte e ricostruire l'intero.
Dipende da fattori come la memoria della macchina, la grandezza dei file,
etc, etc...
Se richiede poco calcolo, meglio caricarlo tutto in meomria, visto che
l'overhead di lettura e scrittura diventa significativo. Se e' grande, e'
meglio accedere volta per volta.
file piccoli, vanno meglio tutti in memoria, idem come file di frequente
accesso
file enormi, meglio ottimizzare lo spazio.
Macchine lente, ottimizzare per la velocita'.
Macchine con poca memoria, per lo spazio.
e via dicendo...


Dura la vita...
Manlio Perillo

memorizzare i valori in un vector<int>, dopodiche' leggi il 18° elemento
<CUT>
ma speravo ci fosse un metodo più *pulito*.
Grazie ancora,
Vale

 wrote in message WKVm5.83492$dF5.1...@news.infostrada.it...

Prova a dare una occhiata al mio post "stream ad accesso casuale".
Forse la cosa ti potrebbe interessare...
Manlio Perillo