Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: memory mapped file - пример.  (Прочитано 22228 раз)
0 Пользователей и 1 Гость смотрят эту тему.
bon
Интересующийся

ua
Offline Offline

« : 21-06-2010 12:46 » 

Добрый день.

Хотел спросить, не поможет ли мне кто разобраться с boost-ом. ( Заранее говорю, что я нуб ):
Мне нужно при помощи boost->interprocess поместить в память файл ( любой, для теста ) а затем получить из этого файла что-нибудь, допустим несколько байт информации. Работаю в Visual Studio 2005. Boost сам я подключил, попробовал занести что-то в память...

Собственно вот текст того, что я пока имею ( в основном взято с examle файла на офф. сайте буста. ) :

#include <boost/interprocess/file_mapping.hpp>
#include <boost/interprocess/mapped_region.hpp>
int _tmain(int argc, _TCHAR* argv[])
{
 using namespace boost::interprocess;
file_mapping m_file       
   ("C:/1.txt" ,read_write );
      mapped_region region(m_file, read_write); 
      void * addr       = region.get_address();
      std::size_t size  = region.get_size(); 
      std::memset(addr, 1, size)  ;
     _gettch(); //это просто для проверки
      return 0;
}

Понимаю что это вроде как ерунда... но русской документации по boost-у я не нашел... Был бы очень признателен за минимальное разьяснение, и/или за програмный код.
Заранее спасибо.
Записан
bon
Интересующийся

ua
Offline Offline

« Ответ #1 : 21-06-2010 13:46 » 

Собственно, на данном этапе код меняет в указанном файле все симовлы на единицы(в ASCII кодах), ну или на какой-либо другой символ, если в memset вместо 1 прописать другой код. Но это я просто для проверки boost-а... а как получить данные из памяти я не знаю.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #2 : 21-06-2010 14:19 » 

вот у тебя указатель для доступа к данным
Код:
void * addr       = region.get_address(); 
ты же используя memset и так получаешь доступ к данным
или я что-то не догоняю
Записан

Странно всё это....
bon
Интересующийся

ua
Offline Offline

« Ответ #3 : 22-06-2010 06:04 » 

Нет - скорее всего ты как-раз все догоняешь, а я просто нуб, который не может разобраться в простом куске кода. Собственно ок, у меня есть указатель для доступа к данным. А как мне получить эти данные? ( занести в переменную X допустим третий байт из  памяти, если конечно этот файл вообще оказался в памяти )?
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #4 : 22-06-2010 06:15 » 

Код:
int a = *reinterpret_cast<int*>(addr);

а можно так
Код:
MyClass * a = reinterpret_cast<MyClass*>(addr);
cout << a->b;

в общем вся механика указателей в твоём распоряжении
короче я не вижу разницы между указателем addr и любым другим
ну не считая того факта, что сдвиг окна мапирования приведёт к инвалиадации указателей
Записан

Странно всё это....
bon
Интересующийся

ua
Offline Offline

« Ответ #5 : 22-06-2010 06:28 » 

О- быстро. Правда я все-равно запутался... reinterpret_cast - я так понял это конвертирует 1 тип указателя в другой тип? Зачем это делать?  А в " MyClass * a = reinterpret_cast<MyClass*>(addr); " компилятор ругается 'MyClass' : undeclared identifier.
Записан
bon
Интересующийся

ua
Offline Offline

« Ответ #6 : 22-06-2010 06:42 » 

int a = *reinterpret_cast<int*>(addr); - сработал. Я вывел а на экран - увидел 9-ти значное число. Что это за число? Улыбаюсь
Я еще раз попробую объяснить поставленную передо мной задачу...

допустим у меня есть файл file.txt. В нем числа. От 1 до 9. (123456789)
Мне нужно с использованием boost/interprocess занести этот файл в память, затем из памяти считать и вывести на экран допустим  3-ий символ. ( число 3 ).

Очень прошу помочь мне с этим.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 22-06-2010 07:35 » 

int a = *reinterpret_cast<int*>(addr); - сработал. Я вывел а на экран - увидел 9-ти значное число. Что это за число? Улыбаюсь
Я еще раз попробую объяснить поставленную передо мной задачу...

полагаю это первые 4 байта файла представленные в виде числа

если тебе нужны все числа, то
Код:
int * int_addr = addr;
for(bla-bla-bla; ++int_addr)
  cout << *int_addr;
выведет на экран все числа типа int исходя из предположения, что файл забит числами типа int, а не обычным тестом
« Последнее редактирование: 22-06-2010 07:38 от Антон (LogRus) » Записан

Странно всё это....
bon
Интересующийся

ua
Offline Offline

« Ответ #8 : 22-06-2010 07:41 » 

А на основании чего Вы так полагаете? ( не в  коем разе не хочу "наехать" - просто хочу понять Улыбаюсь ) собственно что выходит - есть файл. Содеражит текст: "123456789". В результате проделанного int a = 875770417 Что-то не моуг связать одно с другим.
Записан
bon
Интересующийся

ua
Offline Offline

« Ответ #9 : 22-06-2010 07:49 » 

int * int_addr = addr; - выдает ошибку: 'initializing' : cannot convert from 'void *' to 'int *'
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #10 : 22-06-2010 07:53 » 

int * int_addr = addr; - выдает ошибку: 'initializing' : cannot convert from 'void *' to 'int *'
reinterpret_cast добавь

А на основании чего Вы так полагаете? ( не в  коем разе не хочу "наехать" - просто хочу понять Улыбаюсь )

просто пример использования

Записан

Странно всё это....
bon
Интересующийся

ua
Offline Offline

« Ответ #11 : 22-06-2010 08:12 » 

Написал:

int * int_addr = reinterpret_cast<int*>(addr);
cout << *int_addr;

Получил тот же набор цифр.
Записан
bon
Интересующийся

ua
Offline Offline

« Ответ #12 : 22-06-2010 08:13 » 

Т.е. вместо моих 123456789 получаю 875770417 Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 22-06-2010 08:15 » 

итого
875770417

0x 34 33 32 31

"1234"...
Улыбаюсь
Записан

bon
Интересующийся

ua
Offline Offline

« Ответ #14 : 22-06-2010 08:19 » 

Э... Улыбаюсь А ведь и точно. Спасибо.

 Можно еще спросить - а как тогда получить следующие символы?
... и почему получается по 4?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #15 : 22-06-2010 08:25 » 

А в int больше и не помещается на твоей машине, те всего 4 байта. Ага
« Последнее редактирование: 22-06-2010 08:28 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 22-06-2010 08:27 » 

можно так

BYTE* pBeg = (BYTE*)addr;

а потом в цикле прошагать число байтов, равное длине файла

Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #17 : 22-06-2010 08:28 » 

Лёш, только 4 ... 3 ... 2 ... 1 Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 22-06-2010 08:30 » 

Джон, неа! Нифига )) Интеловский порядок - младший байт по младшему адресу. У 0x00000000 младший байт справа, а у строки младший байт слева
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #19 : 22-06-2010 08:40 » 

итого
875770417

0x 34 33 32 31

"1234"...
Улыбаюсь

Лёш, ты можешь рассказывать всё что угодно, но 0x34 -> '4', 0x33 -> '3', 0x32 -> '2', 0x31 -> '1' Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
bon
Интересующийся

ua
Offline Offline

« Ответ #20 : 22-06-2010 08:43 » 

BYTE* pBeg = (BYTE*)addr;

Error - 'BYTE' : undeclared identifier

Что включить для BYTE?
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 22-06-2010 08:45 » 

ничего не включай. используй char вместо - тебе ведь символы надо?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #22 : 22-06-2010 08:46 » 

Попробуй byte или unsigned char.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
bon
Интересующийся

ua
Offline Offline

« Ответ #23 : 22-06-2010 08:59 » 

Мне хоть что-то надо Улыбаюсь Хотя 4 символа уже получил, так что хоть что-то есть, уже cool. Но вообще в идеале мне надо значения вытаскивать из файла. У меня есть .hgt файл, он имеет имеет размер 2884802 байт и представляет собой матрицу размером 1201x1201 из двухбайтовых значений. Каждому двухбайтовому элементу матрицы соответствует высота в метрах. Очерёдность байтов в файле обратная: сначала идёт старший байт числа, затем младший. Мне нужно из него вытаскивать указанное значение.
Но это в будущем... я пока хотел просто занести файл в память и считать из памяти символ.

Кстати с char все отлично получается - считал все что надо. Большое спс. Можно я к вам еще загляну в ближайшее время с моими нубскими вопросами? Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 22-06-2010 09:19 » new

итого
875770417

0x 34 33 32 31

"1234"...
Улыбаюсь

Лёш, ты можешь рассказывать всё что угодно, но 0x34 -> '4', 0x33 -> '3', 0x32 -> '2', 0x31 -> '1' Ага
Джон, я не олифил, ты олифил Улыбаюсь) Всё-таки строка будет "1234"
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines