C ++在缓冲区中读取整个文件

时间:2013-09-15 18:45:58

标签: c++ raii

在C ++缓冲区中读取整个文件内容的好方法是什么?

虽然在普通C中我可以使用fopen(), fseek(), fread()函数组合并将整个文件读取到缓冲区,但对C ++使用它仍然是个好主意吗?如果是,那么我怎样才能在打开时使用RAII方法,为缓冲区分配内存,读取和读取文件内容到缓冲区。

我应该为缓冲区创建一些包装类,它在析构函数中释放内存(为缓冲区分配),以及用于文件处理的相同包装器?

3 个答案:

答案 0 :(得分:52)

对于非常基本的功能,不需要包装类:

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! */
}

答案 1 :(得分:16)

您可以使用输入文件流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>()是一个默认构造的迭代器表示当第一个迭代器到达内容结尾时您将获得的特殊状态“end-of-stream”

答案 2 :(得分:13)

我的大部分课程都有:

/** 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