This answer sottolinea il fatto che C++ non è adatto per l'iterazione su un file binario, ma questo è ciò di cui ho bisogno in questo momento, in breve ho bisogno di operare su file in modo "binario", sì tutti i file sono binari anche i file .txt, ma sto scrivendo qualcosa che opera su file immagine, quindi ho bisogno di leggere file che sono ben strutturati, se i dati sono disposti in modo specifico.File binari ed iteratori C++: con 1: 1 utilizzando ifstreambuf_iterator?
Mi piacerebbe leggere l'intero file in una struttura dati come std::vector<T>
in modo da poter chiudere quasi immediatamente il file e lavorare con il contenuto in memoria senza preoccuparmi più dell'I/O del disco.
In questo momento, il modo migliore per eseguire un'iterazione completo su un file in base alla libreria standard è qualcosa sulla falsariga di
std::ifstream ifs(filename, std::ios::binary);
for (std::istreambuf_iterator<char, std::char_traits<char> > it(ifs.rdbuf());
it != std::istreambuf_iterator<char, std::char_traits<char> >(); it++) {
// do something with *it;
}
ifs.close();
o utilizzare std::copy
, ma anche con std::copy
utilizzare sempre istreambuf
iteratori (quindi se capisco correttamente la documentazione del C++, stai praticamente leggendo 1 byte per ogni chiamata con il codice precedente).
Quindi la domanda è: come posso scrivere un iteratore personalizzato? da dove dovrei ereditare?
Suppongo che questo sia importante anche durante la scrittura di un file su disco, e presumo che potrei usare la stessa classe di iteratore per scrivere, se ho torto non esitate a correggermi.
La * dimensione * dei dati in entrata ti preclude solo da ['ifs.read'] (http://en.cppreference.com/w/cpp/io/basic_istream/read) - consente di allineare i dati in un 'std :: vector' e iterando su quello? –
WhozCraig
@WhozCraig per ora non penso che il file sia troppo grande per essere tenuto in memoria (se questo è ciò a cui ti riferisci), sto bene con 'read' o in qualsiasi altro modo, anche il costruttore del La classe 'vector' supporta gli iteratori, quindi sto bene da quella parte, il" problema "sono gli iteratori stessi, vorrei scriverne uno per cercare di sfogliare i dati in modo diverso. EDIT: Vorrei evitare ogni modo C-ish, rimarrò con gli iteratori. – user2485710
* stai praticamente leggendo 1 byte ad ogni chiamata * - dal buffer in memoria di 'ifstream', non dal file stesso. Le chiamate attuali di lettura (2) sono ancora per ogni 4k o 16k o qualunque sia il buffer predefinito per te. – Cubbi