This answer zwraca uwagę na fakt, że C++ nie nadaje się dobrze do iteracji pliku binarnego, ale tego właśnie potrzebuję, krótko mówiąc, operuję na plikach w "binarny" sposób, tak, wszystkie pliki są binarne nawet pliki .txt, ale piszę coś, co działa na plikach obrazów, więc muszę czytać pliki, które są dobrze skonstruowane, gdyby dane były ułożone w określony sposób.Pliki binarne i iteratory C++: ucieczka z 1: 1 przy użyciu ifstreambuf_iterator?
Chciałbym przeczytać cały plik w strukturze danych, takiej jak std::vector<T>
, dzięki czemu mogę prawie natychmiast zamknąć plik i pracować z zawartością w pamięci, nie troszcząc się już o dysk I/O.
Teraz najlepszym sposobem, aby przeprowadzić kompletne iteracji nad plikiem według standardowej biblioteki jest coś wzdłuż linii
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();
lub użyć std::copy
, ale nawet z std::copy
zawsze jesteś przy użyciu istreambuf
iteratory (więc jeśli dobrze rozumiem dokumentację C++, zasadniczo czytasz 1 bajt przy każdym wywołaniu z poprzednim kodem).
Pytanie brzmi: jak utworzyć niestandardowy iterator? skąd powinienem dziedziczyć?
Zakładam, że jest to również ważne podczas zapisywania pliku na dysk i zakładam, że mógłbym użyć tej samej klasy iteratora do napisania, jeśli się mylę, proszę, popraw mnie.
Czy * rozmiar * danych przychodzących wyklucza Cię tylko ['ifs.read'] (http://en.cppreference.com/w/cpp/io/basic_istream/read) - dane prosto do góry w 'std :: vector' i iterowanie nad tym? –
WhozCraig
@WhozCraig na razie Nie sądzę, że plik jest zbyt duży, aby przechowywać go w pamięci (jeśli to jest to, co masz na myśli), mam się dobrze z 'odczytaniem 'lub w jakikolwiek inny sposób, nawet konstruktorem 'klasa' vector' obsługuje iteratory, więc jestem w porządku po tej stronie, "problemem" są same iteratory, chciałbym napisać jeden, aby spróbować inaczej przeglądać dane. EDIT: Chciałbym uniknąć jakiejkolwiek C-ish sposób, będę trzymać się z iteratorów. – user2485710
* zasadniczo czytasz 1 bajt przy każdym wywołaniu * - z bufora '' ifstream' w pamięci, a nie z samego pliku. Rzeczywiste wywołania read (2) są nadal dla każdego 4k lub 16k lub cokolwiek jest domyślnym buforem dla ciebie. – Cubbi