Простой способ заменить fread () чтением из массива байтов?

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

Спасибо!

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

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

person Sam Washburn    schedule 04.05.2010    source источник


Ответы (4)


Я не знаю такой обертки, но не думаю, что было бы слишком сложно сделать свою собственную. Это потому, что подход 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() «конструктора», возможно, потребуется немного изменить, так как идентификатор, который вам нужен, теперь является адресом памяти, а не именем файла.

person j_random_hacker    schedule 04.05.2010

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

man 3 fmemopen
person nategoose    schedule 04.05.2010

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

person jamesdlin    schedule 04.05.2010

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

person Hans Passant    schedule 04.05.2010