#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:
Посмотрите, как Джон Рэтклифф заменил стандартный файловый интерфейс ввода-вывода. Он поддерживает нужную вам функцию.
Вам все равно потребуется реорганизовать код загрузки растрового изображения, чтобы использовать новый интерфейс. Однако этот интерфейс поддерживает загрузку из файла на диске или фрагмента памяти в памяти (а также запись в файл на диске или в расширяемые фрагменты памяти).