Эмулировать указатель на файл C ?

#c #file #pointers #bitmap

#c #файл #указатели #растровое изображение

Вопрос:

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

Извините, если это странный вопрос.

Комментарии:

1. Вы имеете в виду указатель на файл, как в FILE * , или …?

2. @Matti Virkkunen Да. ФАЙЛ *

3. Просто чтобы уточнить, под «фрагментом памяти» вы подразумеваете, что у вас есть char * , который указывает на какой-то буфер где-то?

4. @Оли Чарльзуорт, Да. Извините. Я забыл указать вещи, но я учусь 🙂

Ответ №1:

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

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

Ответ №2:

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

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

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

 int p[2]; 
pipe(p); 
  

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

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

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

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

Теперь :

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

я выведу «whateveryouwant».

Комментарии:

1. К сожалению, я не думаю, что Windows 7 поддерживает POSIX. В любом случае спасибо!

Ответ №3:

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

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