Существует тривиальный идиоматический способ выполнения этой операции.
#include <string>
#include <fstream>
#include <sstream>
std::string load_file ( const std::string& path )
{
std::ostringstream contents;
std::ifstream file(path);
if ( !file.is_open() ) {
// process error.
}
contents << file.rdbuf();
return (contents.str());
}
Примечание : эта функция не использует поиск размера (вбайт) входного файла.Это имеет обратную сторону (несколько) перераспределений для увеличения буфера, поскольку больше входных данных становится доступным.Он имеет преимущество при работе с другими std::istream
реализациями, которые могут не иметь возможности заранее предоставить размер содержимого (т. Е. Чтение из сокета).
Редактировать : так как ваши требования требуют использования FILE*
, который уже открыт и вы не можете изменить, вы можете реализовать реализацию std::streambuf
, которая использует существующий FILE*
, чтобы разрешитьповторное использование операций высокого уровня std::istream
и std::ostream
.
Пример реализации доступен прямо здесь, в StackOverflow .
PS : Если вы никогда не использовали реализации потокового буфера нестандартной библиотеки, вот краткий обзор того, как написать функцию с учетом реализации, на которую я указывал.
#include <string>
#include <istream>
#include <sstream>
#include "FILEbuf.h"
std::string load_file ( ::FILE * opened_c_file )
{
FILEbuf buffer(opened_c_file);
std::istream file(&buffer);
std::ostringstream contents;
contents << file.rdbuf();
return (contents.str());
}