istream vs内存映射文件?

use*_*112 12 c++

我试图将文件映射到内存然后逐行解析 - istream我应该使用什么?

istream是否与在Windows上将文件映射到内存相同?我在寻找将文件映射到内存的完整示例时遇到了困难.

我见过人们链接来自MSDN的内存映射文章,但是如果有人可以推荐一个小的(~15行?)示例我会非常感激.

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

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

ild*_*arn 12

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.
Run Code Online (Sandbox Code Playgroud)

至于内存映射本身,我建议使用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();
Run Code Online (Sandbox Code Playgroud)

代码imemstream取自此答案迪特马尔·库尔.

  • mmaped_data的输入来自哪里?我们需要引用我认为的文件? (2认同)