2013-06-18 2 views
1

Я пытаюсь использовать boost для сопоставления файла с памятью, имеющей 3 поплавки на строку (x, y, z координаты точек). Я пытаюсь сохранить данные в виде cl_float3 (для openCL), но, похоже, это не сработает. Это мой код:Memory-mapping 2D-массив с использованием boost

cl_float3 *data; 
boost::iostreams::mapped_file_source file; 
size = 785444; // size of the file 
int numBytes = size*sizeof(cl_float)*3; 
file.open(filename,numBytes); 
if(file.is_open()) { 
    data = (cl_float3*)file.data(); 
    file.close(); 
} 

Ошибка при чтении ошибки при нарушении чтения при попытке использовать массив данных. Любая помощь?

+0

Это действительно «3 плавает в строку», или это «3 ASCII-кодированный символьных строк, представляющих приближенное значение с плавающей запятой в строку» - т.е. это бинарное 4-байтовое представление с плавающей точкой, или читаемое человеком текстовое представление типа «3.141593»? – twalberg

+0

Да, я попробовал необработанный двоичный файл в качестве ввода, и он сработал. – shunyo

ответ

2

Вы закрываете файл, как только его открываете. Я не читал документацию для сопоставленных файлов памяти boost, но вам, вероятно, нужно оставить файл открытым.

if (file.is_open()) { 
    data = (cl_float3*) file.data(); 
    file.close(); // remove this line 
} 
+0

Спасибо, что поймали это. Но он все еще дает значения мусора для чтения в данных. – shunyo

+0

В каком формате находится файл? Это ожидает необработанных двоичных значений с плавающей запятой. – Wug

+0

Я пробовал несколько форматов - ascii (.xyz)/fast binary (.fbi)/binary (.bin). Хотя я не знаю, являются ли форматы исходными двоичными файлами или нет, я получаю либо нули, либо значения мусора всегда. – shunyo