2010-05-04 2 views
0

J'ai un morceau de code qui doit être exécuté à partir d'un environnement restreint qui n'autorise pas stdio (compilateur Alchemy de Flash). Le code utilise les fonctions standard fopen/fread et j'ai besoin de le convertir pour lire à partir d'un tableau char *. Des idées sur la meilleure façon d'aborder cela? Est-ce qu'un wrapper existe ou une bibliothèque qui pourrait aider?Un moyen facile de remplacer fread() avec la lecture d'un tableau d'octets?

Merci!

EDIT: Je devrais également mentionner qu'il est en train de lire dans les structures. Comme ceci:

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

Répondre

2

Je ne connais pas d'emballage de ce genre, mais je ne pense pas que ce serait trop difficile de faire les vôtres. C'est parce que l'approche de C de fichier I/O cache tout derrière l'interface FILE*, ce qui en fait bien orienté objet.

Puisque vous utilisez C plutôt que C++, je suggère d'utiliser des macros préprocesseur pour remplacer toutes les occurrences de fopen(), fclose() et fread() avec MEM_fopen() etc., qui sont des routines que vous allez définir. Vous devez définir votre propre type FILE, pour lequel vous pouvez simplement utiliser les éléments suivants:

typedef unsigned char *FILE; 

(Si vous avez besoin de gérer EOF, vous hériterez besoin FILE être un struct avec un champ length supplémentaire.)

Ensuite, votre fonction MEM_fread() ressemblera à quelque chose comme:

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

la signature du MEM_fopen() "constructeur" peut avoir besoin de changer légèrement, puisque l'identifiant dont vous avez besoin est maintenant une adresse mémoire au lieu d'un nom de fichier.

+0

Merci, cela fonctionne très bien. –

1

Est-ce que memcpy est insuffisant? Il devrait être assez facile d'écrire autour d'un wrapper qui a une signature similaire à fread.

1

Il vous suffit d'écrire votre propre version de fread(). Passez le .obj ou .lib à l'éditeur de liens avant la bibliothèque CRT et l'éditeur de liens choisira votre définition au lieu de celle de la bibliothèque CRT.

2

glibc a fmemstream, open_memstream et open_wmemstream qui renvoient tous un FILE * que vous pouvez utiliser avec le fichier stdio fonctions IO directement et appeler également fclose sur.

man 3 fmemopen 
Questions connexes