Jak wczytać plik do std::string
, czyli przeczytać cały plik na raz?
Osoba wywołująca powinna określić tryb tekstowy lub binarny. Rozwiązanie powinno być zgodne ze standardami, przenośne i wydajne. Nie powinien niepotrzebnie kopiować danych ciągu i powinien unikać realokacji pamięci podczas odczytu ciągu.
Jednym ze sposobów osiągnięcia tego byłoby ustalenie rozmiaru pliku, zmiana rozmiaru std::string
i fread()
na const_cast<char*>()
data()
std::string
. Wymaga to, aby dane std::string
były ciągłe, co nie jest wymagane przez standard, ale wydaje się, że tak jest w przypadku wszystkich znanych implementacji. Co gorsza, jeśli plik będzie czytany w trybie tekstowym, rozmiar std::string
może nie być równy rozmiarowi pliku.
W pełni poprawne, zgodne ze standardami i przenośne rozwiązania można skonstruować, używając std::ifstream
rdbuf()
do std::ostringstream
, a stamtąd do std::string
. Może to jednak spowodować skopiowanie danych ciągu i/lub niepotrzebne ponowne przydzielenie pamięci.
- Czy wszystkie odpowiednie implementacje bibliotek standardowych są wystarczająco inteligentne, aby uniknąć niepotrzebnych kosztów ogólnych?
- Czy jest na to inny sposób?
- 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
jest. - person legends2k   schedule 27.11.2014