boost — потоковые типы в C ++, как читать из IstringStream?

у меня есть текстовый файл, который имеет миллионы строк, каждая строка имеет 3 числа с плавающей запятой, я прочитал его, используя следующий код:

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

и я отлично работаю

Теперь я хочу попробовать сделать то же самое, используя файлы Boost Mapped, поэтому я делаю следующее

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 не получают фактические числа с плавающей точкой, а просто мусор, и после одной итерации время «В» заканчивается.

Я, вероятно, делаю что-то ужасно неправильно

Как я могу использовать и анализировать данные в отображенном файле памяти?
Я искал по всему Интернету и особенно переполнение стека и не мог найти ни одного примера.

Я использую Windows 7 64 бит.

0

Решение

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';
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]