Como faço para ler um arquivo em um std::string
, ou seja, ler o arquivo inteiro de uma só vez?
O modo texto ou binário deve ser especificado pelo chamador. A solução deve ser compatível com os padrões, portátil e eficiente. Ele não deve copiar desnecessariamente os dados da sequência e evitar realocações de memória durante a leitura da sequência.
Uma maneira de fazer isso seria declarar o tamanho do arquivo, redimensionar o std::string
e fread()
para o std::string
's const_cast<char*>()
' ed data()
. Isso requer que os std::string
dados sejam contíguos, o que não é exigido pelo padrão, mas parece ser o caso de todas as implementações conhecidas. O que é pior, se o arquivo for lido no modo de texto, o std::string
tamanho do arquivo pode não ser igual ao tamanho do arquivo.
Soluções totalmente corretas, compatíveis com os padrões e portáteis podem ser construídas usando std::ifstream
's rdbuf()
em ae std::ostringstream
de lá em a std::string
. No entanto, isso pode copiar os dados da string e / ou realocar desnecessariamente a memória.
- Todas as implementações relevantes de bibliotecas padrão são inteligentes o suficiente para evitar toda a sobrecarga desnecessária?
- tem outro jeito de fazer isto?
- Perdi alguma função Boost oculta que já fornece a funcionalidade desejada?
void slurp(std::string& data, bool is_binary)
rdbuf
(aquele na resposta aceita) não é o mais rápido, read
é.