在 C++ 的缓冲区中读取整个文件内容的好方法是什么?
虽然在普通 CI 中可以使用fopen(), fseek(), fread()
函数组合并将整个文件读取到缓冲区中,但在 C++ 中使用相同的函数仍然是一个好主意吗?如果是,那么我如何在打开、为缓冲区分配内存、读取和读取文件内容到缓冲区时使用 RAII 方法。
我应该为缓冲区创建一些包装器类,它在它的析构函数中释放内存(为缓冲区分配),并为文件处理创建相同的包装器吗?
非常基本的功能不需要包装类:
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! */
}
您可以使用输入文件流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;
}
在这种情况下,我使用迭代器使用 ifstream 的内容构建一个新字符串,std::istreambuf_iterator<char>(file)
创建一个指向 ifstream 开头的迭代器,并且std::istreambuf_iterator<char>()
是一个默认构造的迭代器,指示特殊状态“流结束”,它当第一个迭代器到达内容的末尾时,您将得到。
我在大多数程序中都有的东西:
/** 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();
}
可以放在页眉中。
我想我在这里找到了它:https ://stackoverflow.com/a/116220/257568