使用Boost mmap读取文本文件

时间:2014-01-29 12:43:47

标签: file boost iostream mmap

我正在阅读以下文件:


FILE.TXT

  

Y:\ Test \ DOCUMENTS \ DOCUMENTS \ Flux Assurance   2 \ multi \ ACTEPROC_OK \ 018-1-R.xml Y:\ Test \ DOCUMENTS \ DOCUMENTS \ Flux   保证2 \ multi \ ACTEPROC_OK \ A018-2-R.xml   Y:\ Test \ DOCUMENTS \ DOCUMENTS \ Flux Assurance   2 \ multi \ ACTEPROC_OK \ 021-1-R.xml Y:\ Test \ DOCUMENTS \ DOCUMENTS \ Flux   保证2 \ multi \ ACTEPROC_OK \ A021-2-R.xml   Y:\ Test \ DOCUMENTS \ DOCUMENTS \ Flux Assurance   2 \ multi \ ACTEPROC_OK \ 022-1-R.xml Y:\ Test \ DOCUMENTS \ DOCUMENTS \ Flux   保证2 \ multi \ ACTEPROC_OK \ 022-2-R.xml   Y:\ Test \ DOCUMENTS \ DOCUMENTS \ Flux Assurance   2个\多\ ACTEPROC_OK \ 025-1-R.xml


源代码:

#include <iostream>
#include <vector>
#include <boost/iostreams/device/mapped_file.hpp>
#include <boost/iostreams/stream.hpp>

std::vector<string> readFile(string);

int main()
{
    std::vector<string> res = readFile("file.txt");
    return 0;
}

std::vector<string> readFile(string f)
{
    boost::iostreams::stream<boost::iostreams::mapped_file_source> str(f);
    std::vector<string> app;
    for(string x; str >> x;)
    {
        app.push_back(x);
    }
    return app;
}//end

问题:

由于 Flux 保证2 之间存在空格,因此会将空格视为分隔符。

如何删除分隔符,或明确标识分隔符是什么?

1 个答案:

答案 0 :(得分:1)

这与增强或记忆映射无关。

首先

str.unsetf(std::ios::skipws); 

将阻止将空格用作分隔符/跳过。

其次,我 认为 (你没有提及其中任何一个)你想按行阅读:

for(std::string x; std::getline(str, x, '\n');)
{
    app.push_back(x);
}

如您所见,您已经可以指定分隔符。

最后,考虑使用解析器生成器。参见例如这里:

其中包含一个使用Boost Spirit从内存映射文件进行解析的示例。