Эмулировать указатель файла C ++? - PullRequest
2 голосов
/ 01 мая 2011

Я пытаюсь загрузить растровое изображение из архива.Класс растрового изображения, который я имею, берет символьный указатель на имя файла и затем загружает его, если он находится в том же каталоге.Класс загрузки растровых изображений хорошо протестирован, и я не хочу много с ним связываться.Проблема в том, что он использует указатель файла для загрузки и выполнения всех своих манипуляций с файлом.Есть ли способ эмулировать указатель файла и фактически вместо этого читать его из чанка в памяти?

Ответы [ 3 ]

5 голосов
/ 01 мая 2011

Выполните рефакторинг и создайте функции, которые принимают те же параметры, что и раньше: Если вы использовали fopen, fread и fseek, которые читают с диска, создайте mopen, mread и mseek, которые читают файл из памяти. Вам нужно только исправить имя функции.

Это должно быть легко без риска, и в конце код не будет выглядеть как грязный хак.

4 голосов
/ 01 мая 2011

Вы также можете использовать трубу.Канал - это часть памяти, где вы можете читать и писать, используя файловые примитивы.Что в принципе и нужно

(Предполагается, что операционная система POSIX)

создает канал:

int p[2]; 
pipe(p); 

используйте fdopen (), чтобы превратить дескриптор файла канала в FILE*

FILE *emulated_file = fdopen(p[0], "r"); 

, затем напишите все, что вы хотите, в конец записи канала:

write(p[1], 17 ,"whatevereyouwant");

Сейчас:

buf[32];
fread(&buf,1,32, emulated_file); 
cout<<buf<<endl;

выведет "whateveryouwant".

2 голосов
/ 01 мая 2011

Проверьте Файловый интерфейс Джона Рэтклиффа замена стандартного файлового ввода-вывода. Поддерживает нужную вам функцию.

Вам все еще нужно будет изменить код загрузки растрового изображения, чтобы использовать новый интерфейс. Однако этот интерфейс поддерживает загрузку из файла на диске или фрагмента памяти в памяти (а также запись в файл на диске или в расширяемые фрагменты памяти).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...