Jak wczytać plik do std::string
, tj. Czytać cały plik naraz?
Wzywający powinien określić tryb tekstowy lub binarny. Rozwiązanie powinno być zgodne z normami, przenośne i wydajne. Nie powinien niepotrzebnie kopiować danych ciągu i powinien unikać ponownego przydziału pamięci podczas odczytu ciągu.
Jednym ze sposobów na zrobienie tego może być statystyka rozmiaru pliku, zmiana rozmiaru std::string
i fread()
na edycję std::string
's const_cast<char*>()
' data()
. Wymaga std::string
to ciągłości danych, co nie jest wymagane przez standard, ale wydaje się, że tak jest w przypadku wszystkich znanych implementacji. Co gorsza, jeśli plik jest czytany w trybie tekstowym, std::string
rozmiar może nie odpowiadać rozmiarowi pliku.
W pełni poprawne, zgodne ze standardami i przenośne rozwiązania mogą być konstruowane przy użyciu std::ifstream
plików rdbuf()
a, std::ostringstream
a stamtąd do a std::string
. Może to jednak spowodować skopiowanie danych ciągu i / lub niepotrzebną zmianę alokacji pamięci.
- Czy wszystkie istotne implementacje bibliotek standardowych są wystarczająco inteligentne, aby uniknąć wszystkich niepotrzebnych kosztów ogólnych?
- Czy jest inny sposób, aby to zrobić?
- Czy przegapiłem jakąś ukrytą funkcję Boost, która już zapewnia pożądaną funkcjonalność?
void slurp(std::string& data, bool is_binary)
rdbuf
(ten w zaakceptowanej odpowiedzi) nie jest najszybszy read
.