49

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

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

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

4

3 回答 3

85

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

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! */
}
于 2013-09-15T18:55:23.017 回答
32

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

于 2013-09-15T19:56:31.637 回答
21

我在大多数程序中都有的东西:

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

于 2013-09-15T19:40:13.530 回答