С++ читает весь файл в буфере
Что такое хороший подход для чтения всего содержимого файла в буфере для С++?
В то время как в простой C я мог использовать комбинацию функций fopen(), fseek(), fread()
и прочитать весь файл в буфере, все-таки хорошая идея использовать его для С++? Если да, то как я могу использовать подход RAII при открытии, распределяя память для буфера, чтение и чтение содержимого файла в буфер.
Должен ли я создать некоторый класс-оболочку для буфера, который освобождает память (выделенную для буфера) в нем деструктор и ту же оболочку для обработки файлов?
Ответы
Ответ 1
Нет необходимости в классах-оболочках для очень простых функций:
std::ifstream file("myfile", std::ios::binary | std::ios::ate);
std::streamsize size = file.tellg();
file.seekg(0, std::ios::beg);
std::vector<char> buffer(size);
if (file.read(buffer.data(), size))
{
/* worked! */
}
Ответ 2
Вы можете получить доступ к содержимому файла с потоком входного файла std:: ifstream, затем вы можете использовать std:: istreambuf_iterator, чтобы перебирать содержимое ifstream,
std::string
getFileContent(const std::string& path)
{
std::ifstream file(path);
std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
return content;
}
В этом случае im, использующий итератор для создания новой строки с использованием содержимого ifstream, std::istreambuf_iterator<char>(file)
создает итератор для начала ifstream, а std::istreambuf_iterator<char>()
- это итератор, построенный по умолчанию, который указывает специальный state "end-of-stream" , который вы получите, когда первый итератор достигнет конца содержимого.
Ответ 3
Что-то, что у меня есть в большинстве моих программ:
/** Read file into string. */
inline std::string slurp (const std::string& path) {
std::ostringstream buf; std::ifstream input (path.c_str()); buf << input.rdbuf(); return buf.str();
}
Может быть помещен в заголовок.
Я думаю, что нашел его здесь: fooobar.com/info/15436/...