0

何百万行もあるtxtファイルがあり、各行には3つのフロートがあり、次のコードを使用して読み取ります:

ifstream file(path)
float x,y,z;
while(!file.eof())
  file >> x >> y >> z;

そして私は完璧に動作します。

次に、Boost マップ ファイルを使用して同じことを試してみたいので、次のようにします。

string filename = "C:\\myfile.txt";
file_mapping mapping(filename.c_str(), read_only);
mapped_region mapped_rgn(mapping, read_only);
char* const mmaped_data = static_cast<char*>(mapped_rgn.get_address());
streamsize const mmap_size = mapped_rgn.get_size();

istringstream s;
s.rdbuf()->pubsetbuf(mmaped_data, mmap_size);
while(!s.eof())
  mystream >> x >> y >> z;

問題なくコンパイルされますが、残念ながら、X、Y、Z は実際の浮動小数点数を取得できず、無駄であり、1 回の反復の後、While は終了します。

私はおそらくひどく悪いことをしている

メモリマップファイル内のデータを使用および解析するにはどうすればよいですか? インターネット全体、特にスタックオーバーフローを検索しましたが、例が見つかりませんでした。

Windows7 64ビットを使用しています。

4

1 に答える 1

3

Boost には、この目的のためだけに作成されたライブラリがあります: boost.iostreams

#include <iostream>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/mapped_file.hpp>
namespace io = boost::iostreams;

int main()
{
    io::stream<io::mapped_file_source> str("test.txt");
    // you can read from str like from any stream, str >> x >> y >> z
    for(float x,y,z; str >> x >> y >> z; )
        std::cout << "Reading from file: " << x << " " << y << " " << z << '\n';
}
于 2013-07-03T13:59:50.647 に答える