[c/c++] gestion des buffers

Fermé
bubuche87 Messages postés 41 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 26 janvier 2009 - 21 nov. 2007 à 11:51
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 21 nov. 2007 à 14:34
Bonjour,
je suis en train de programmer un petit programme qui permet de stocker plusieurs fichiers dans un seul. A quoi cela servira-t-il? ben, après compression, on obtient une archive :D
bon, pour être un peu plus exacte (et un peu plus flou ^^), je compte bien creer mon propre système d'archive : d'une part pour l'interet pédagogique ("comment ça marche?" "quelles sont les contraintes?" "quelles sont les alternatives" etc); d'autre part pour des raisons personnelles (ce module doit s'inscrire dans un programme plus gros, et je voudrais pouvoir avoir le contrôle sur tout, ne pas dépendre de choses que je ne comprend pas et qui potentiellement aurons des limitations que je ne m'apercevrais que trop tard).


Bref, pour en revenir au problème : mon fichier archive contient les entête en début de fichier, et le contenu des fichiers ensuite. Mon problème est le suivant : avant, je faisais ma création d'archive en php. J'utilisais des formulaires, je faisais les test et tout le tsoin tsoin. C'était assezz facile de d'abord stocker toutes les entête, de les mettres dans le fichier et ensuite de rajouter le contenu.
Mon problème majur est que cela est beaucoup plus dur en c, car les tableaux n'ont pas une taille dynamique. De plus, je me suis aperçu que ma précédente méthode n'était pas vraiment au point.

J'ai donc eut une nouvelles idée sur comment creer l'archive (je précise que c'est la façon de creer l'archive qui change, pas le résultat final).
Je voudrais pouvoir :
1) ouvrir un fichier ("archive")
2) ouvrir un fichier ("contenu")

3) lire le nom de fichier ("a" par exemple) que je dois ajouter. ouvrir ce fichier("a"), en stocker le contenu dans le "contenu", puis refermer "a". Si l'opération réussi=, je rajoute les entêtes correspondante dans le fichier archive.
je recommence la manip a 2, pour chacun des fichiers.

Quand l'utilisateur a fini d'entrer les nom de fichier, je marque la fin des en têtes et j'enregistre archive.
C'EST LA QUE SURVIENS LE POINT BIZARRE
je sais que les écriture du fichier "contenu" on été misent en mémoire tampon. je réouvre le fichier archive, et je change la cible du pointeur de flux "contenu", pour qu'il écrive à la fin du fichier archive.
Mais je n'arrive pas à réaliser ce derniers point.

Pourriez vous m'aider?
Je vous remercie pour le temps que vous m'avez déjà consacré en lisant ce message.
Je suis ouvert a toutes les autres suggestion sur les façon de générer ce type d'archive.
Je peux également vous décrire les entête :)

pour la lecture, il y a beaucoup moins de problèmes (après des tests faits sur des archives générées par le php :) )
A voir également:

1 réponse

mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
21 nov. 2007 à 14:34
Il faut ouvrir ton fichier en append ("a") lorsque tu le réouvres avec fopen. Le descripteur de fichier (FILE *) pointe exactement à la fin du fichier ouvert, tu peux donc écrire à la suite.
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/fopen.3.html

Contrairement à ce que tu dis tu peux allouer dynamiquement un tableau en C (cf fonction malloc, calloc, realloc etc). En C++ c'est encore plus transparent avec les std::vector.
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/malloc.3.html
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583

Par ailleurs il serait à mon avis plus simple d'utiliser des libraires comme libzzip-dev, libbz2-dev,...pour faire tes archives. Mais bon si tu veux tout recoder c'est ton droit :-) Par exemple sous debian :
https://packages.debian.org/unstable/libdevel/libzzip-dev
https://packages.debian.org/etch/libbz2-dev

Bonne chance
0