簡體   English   中英

在VC ++中讀取一個boost內存映射文件的結尾

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

我正在使用VS2010編寫一個C ++程序來讀取文本文件並從中提取某些信息。 我使用filestream完成了代碼,效果很好。 但是現在我被要求將文件映射到內存並使用它而不是文件操作。

在內存映射的情況下,我絕對是一個新手。 我寫的代碼的一部分如下。

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
}

在使用文件流時,我會使用eofgetline以及string::find來執行操作。 但我不知道如何使用內存映射文件來做到這一點。

編輯1:

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();
}

這個功能起作用了,我得到了所需結構的偏移量。

現在調用此函數后,我調用另一個函數如下:

int GetSystemDetails()
{   
    streamReader.open(apifile, std::ios::binary);

    string read_line;

    getline(streamReader,read_line);

    cout << "LINE : " << read_line;

    streamReader.close();
}

我沒有在read_line中獲得任何數據。 那個內存映射只針對單個函數嗎? 如何在不同的函數中使用相同的內存映射文件?

如果您只是按順序讀取文件,我同意人們質疑mmap的使用。

boost::mapped_file_source為設備建模。 有兩種方法可以使用這樣的設備:

  1. 原始使用它(在嘗試時使用data()
  2. 使用流包裝器

1.使用原始設備源

您可以使用mapped_file_source報告實際大小( m.data()+m.size() )。

我們來取一個樣本來計算行數:

#include <boost/iostreams/device/mapped_file.hpp> // for mmap
#include <algorithm>  // 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, '\n', l-f))))
            m_numLines++, f++;

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

你可以適應這個。 我有幾個基於內存映射文件的更復雜的解析示例:


2.將源設備包裝在istream

這為您提供了所有常見的基於流的c ++標准流操作,因此您可以像往常一樣檢測文件的結尾:

#include <boost/iostreams/device/mapped_file.hpp> // for mmap
#include <boost/iostreams/stream.hpp>             // for stream
#include <algorithm>                              // 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 << "\n";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM