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时,我会使用
编辑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的使用。
1。使用原始设备源
您可以使用映射的文件源报告实际大小(
让我们取一个样本来计算行数:
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。将源设备包装在
这为您提供了所有通常基于流的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 <<" "; } |