c++ - istream 与内存映射文件?

标签 c++

我正在尝试将文件映射到内存,然后逐行解析 - istream 是我应该使用的吗?

在 Windows 上 istream 和映射一个文件到内存是一样的吗?我很难找到将文件映射到内存的完整示例。

我看到有人链接了来自 MSDN 的内存映射文章,但如果有人可以推荐一个小的(~15 行?)示例,我将不胜感激。

我一定是在搜索错误的东西,但是在 Google 上搜索“C++ 内存映射示例”时,我找不到包含迭代的示例。

这些是最接近的结果(只是为了让人们意识到我已经看过):

最佳答案

std::istream 是一种抽象类型——您不能直接使用它。您应该使用自定义数组支持的 streambuf 从它派生:

#include <cstddef>
#include <string>
#include <streambuf>
#include <istream>

template<typename CharT, typename TraitsT = std::char_traits<CharT>>
struct basic_membuf : std::basic_streambuf<CharT, TraitsT> {
    basic_membuf(CharT const* const buf, std::size_t const size) {
        CharT* const p = const_cast<CharT*>(buf);
        this->setg(p, p, p + size);
    }

    //...
};

template<typename CharT, typename TraitsT = std::char_traits<CharT>>
struct basic_imemstream
: virtual basic_membuf<CharT, TraitsT>, std::basic_istream<CharT, TraitsT> {
    basic_imemstream(CharT const* const buf, std::size_t const size)
    : basic_membuf(buf, size),
      std::basic_istream(static_cast<std::basic_streambuf<CharT, TraitsT>*>(this))
    { }

    //...
};

using imemstream = basic_imemstream<char>;

char const* const mmaped_data = /*...*/;
std::size_t const mmap_size = /*...*/;
imemstream s(mmaped_data, mmap_size);
// s now uses the memory mapped data as its underlying buffer.

至于内存映射本身,我建议使用 Boost.Interprocess为此目的:

#include <cstddef>
#include <string>
#include <boost/interprocess/file_mapping.hpp>
#include <boost/interprocess/mapped_region.hpp>

namespace bip = boost::interprocess;

//...

std::string filename = /*...*/;
bip::file_mapping mapping(filename.c_str(), bip::read_only);
bip::mapped_region mapped_rgn(mapping, bip::read_only);
char const* const mmaped_data = static_cast<char*>(mapped_rgn.get_address());
std::size_t const mmap_size = mapped_rgn.get_size();

imemstream 的代码取自 this answer通过 Dietmar Kühl .

关于c++ - istream 与内存映射文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10839747/

相关文章:

c++ - 歧义平方根

c++ - vector 构造函数的另一个违反直觉的行为

c++ - 在 C++11 中,我可以为非聚合类型实现类似构造函数的聚合类型初始化吗?如何实现?

c++ - 互斥锁困惑

c++ - OpenMPI 编译错误

c++ - 返回其参数或检查 nullptr 的函数

C++ 变量和函数

c++ - 为什么调用基类析构函数会导致程序崩溃?

c++ - 在 WebKit 中禁用滚动条(平面框架模式)

c++ - 有没有办法判断我们是否在构造函数中被调用?