关于c ++:在VC ++中读取一个boost内存映射文件的结尾

Read till end of a boost memory mapped file in VC++

我用C++编写了一个程序,用VS2010读取文本文件并从中提取一定的信息。我使用filestream完成了代码,它运行得很好。但是现在我被要求将文件映射到内存并使用它,而不是文件操作。

我绝对是一个记忆绘图的新手。我编写的代码的一部分如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
boost::iostreams::mapped_file_source apifile;

apifile.open(LogFileName,LogFileSize);

if(!apifile.is_open())

return FILE_OPEN_ERROR;

// Get pointer to the data.

PBYTE Buffer = (PBYTE)apifile.data();

while(//read till end of the file)
{
     // read a line and check if it contains a specific word
}

使用filestream时,我会使用eofgetlinestring::find来执行操作。但我不知道如何使用内存映射文件。

编辑1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int ProcessLogFile(string file_name)
{
    LogFileName = file_name;

    apifile.open(LogFileName);//boost::iostreams::mapped_file_source apifile(declared globally)

    streamReader.open(apifile, std::ios::binary);//boost::iostreams::stream <boost::iostreams::mapped_file_source> streamReader(declared globally)

    streamoff Curr_Offset = 0;

    string read_line;

    int session_id = 0;

    int device_id = 0;

    while(!streamReader.eof())
    {
        \\COLLECT OFFSETS OF DIFFERENT SESSIONS
    }

    streamReader.close();
}

这个函数有效,我得到了所需结构的偏移量。

现在,在调用这个函数之后,我调用另一个函数,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
int GetSystemDetails()
{  
    streamReader.open(apifile, std::ios::binary);

    string read_line;

    getline(streamReader,read_line);

    cout <<"LINE :" << read_line;

    streamReader.close();
}

我在读行中没有任何数据。那个内存映射只针对一个函数吗?如何在不同的函数之间使用相同的内存映射文件?


我同意如果你只是按顺序阅读文件,人们会质疑MMAP的使用。

boost::mapped_file_source为设备建模。使用这种设备有两种方法:

  • 使用它的原始(使用data()作为您的尝试)
  • 使用流包装器
  • 1。使用原始设备源

    您可以使用映射的文件源报告实际大小(m.data()+m.size())。

    让我们取一个样本来计算行数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <boost/iostreams/device/mapped_file.hpp> // for mmap
    #include   // for std::find
    #include <iostream>   // for std::cout
    #include <cstring>

    int main()
    {
        boost::iostreams::mapped_file mmap("input.txt", boost::iostreams::mapped_file::readonly);
        auto f = mmap.const_data();
        auto l = f + mmap.size();

        uintmax_t m_numLines = 0;
        while (f && f!=l)
            if ((f = static_cast<const char*>(memchr(f, '
    '
    , l-f))))
                m_numLines++, f++;

        std::cout <<"m_numLines =" << m_numLines <<"
    "
    ;
    }

    你可以适应这个。我有几个更复杂的基于内存映射文件的解析示例:

    • C++中快速文本文件的读取
      请注意,在更新中,您可以看到,实际上,由于顺序访问性质,open()+read()比内存映射更快
    • 如何快速解析C++中的空间分离浮点?

    2。将源设备包装在istream

    这为您提供了所有通常基于流的C++标准流的操作,这样您就可以像以前一样检测文件的末尾:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <boost/iostreams/device/mapped_file.hpp> // for mmap
    #include <boost/iostreams/stream.hpp>             // for stream
    #include                               // for std::find
    #include <iostream>                               // for std::cout
    #include <cstring>

    int main()
    {
        using boost::iostreams::mapped_file_source;
        using boost::iostreams::stream;
        mapped_file_source mmap("test.cpp");
        stream<mapped_file_source> is(mmap, std::ios::binary);

        std::string line;

        uintmax_t m_numLines = 0;
        while (std::getline(is, line))
        {
            m_numLines++;
        }

        std::cout <<"m_numLines =" << m_numLines <<"
    "
    ;
    }