Простой способ заменить fread () на чтение из байтового массива? - PullRequest
0 голосов
/ 04 мая 2010

У меня есть кусок кода, который должен быть запущен из ограниченной среды, в которой не разрешен stdio (Алхимический компилятор Flash). Код использует стандартные функции fopen / fread, и мне нужно преобразовать его для чтения из массива char *. Любые идеи о том, как лучше всего подойти к этому? Существует ли обертка или какая-нибудь библиотека, которая поможет?

Спасибо!

РЕДАКТИРОВАТЬ: Я должен также упомянуть, что он читает в структурах. Как это:

fread(&myStruct, 1, sizeof(myStruct), f);

Ответы [ 4 ]

2 голосов
/ 04 мая 2010

glibc имеет fmemstream, open_memstream и open_wmemstream, которые все возвращают FILE *, который можно напрямую использовать с функциями ввода-вывода файла stdio, а также вызывают fclose on.

man 3 fmemopen
2 голосов
/ 04 мая 2010

Я не знаю ни одной такой обертки, но я не думаю, что было бы слишком сложно сделать свою собственную. Это связано с тем, что подход C к файловому вводу-выводу скрывает все за интерфейсом FILE*, что фактически делает его красиво-ориентированным .

Поскольку вы используете C, а не C ++, я бы предложил использовать макросы препроцессора для замены каждого экземпляра fopen(), fclose() и fread() на MEM_fopen() и т. Д., Которые вы будете определять. Вам нужно будет определить свой собственный тип FILE, для которого вы можете просто использовать следующее:

typedef unsigned char *FILE;

(Если вам нужно управлять EOF, вместо этого вам потребуется FILE, чтобы быть struct с дополнительным полем length.)

Тогда ваша MEM_fread() функция будет выглядеть примерно так:

int MEM_fread(unsigned char *buf, size_t size, size_t n, FILE *f) {
    memcpy(buf, *f, size * n);
    *f += size * n;
    return n;
}

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

1 голос
/ 04 мая 2010

Просто напишите свою собственную версию fread (). Передайте .obj или .lib компоновщику до библиотеки CRT, и компоновщик выберет ваше определение вместо определения из библиотеки CRT.

1 голос
/ 04 мая 2010

Недостаточно memcpy? Должно быть довольно легко написать обертку с подписью, похожей на fread.

...