Zeph Le 14/07/2006 à 14:01 heu c'est du C++ ? (parceque si c'est du C et que le code est rigoureusement identique, à moins d'avoir aucun appel de fonction dans "..." je ne vois pas trop comment ça peut fonctionner (proprement) si FILE* et gzFile sont des types différents ?)

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
Link Le 14/07/2006 à 14:51 Et encore, le fclose() ne marcherait pas non plus sur le gzFile, surtout qu'aucun des deux n'est initialisé...

Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.
Zeph Le 14/07/2006 à 15:00 on sait jamais, si il a un fclose surchargé pour les gzFile; mais bon ça reste curieux comme code

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
Jyaif Le 14/07/2006 à 15:24 Il peut y avoir une relation d'héritage entre gzFile et FILE*
Et puis même si c'est en C, le code "..." cast peut être gzFile et/ou FILE*
spomky> Tu peux utiliser un #define
Généralement on peut faire une macro (pratique, mais crade) ou une fonction pour ça (plus propre, mais moins pratique...)...
Mais là il y a un autre problème... Le code est mal fichu...
Déjà on ne fait pas if (a == b) { } if (a == c) { } mais on fait if (a == b) { } else if (a == c) { } dans ce cas précis...
Ensuite if (a == b) { } else if (a == c) { } dans ce cas précis ça se code même en switch (a) { case b: break; case c: break; } c'est tout au moins plus lisible et éventuellement (si tu avais plus de deux cas disons) plus optimisé.
A partir de là selon la tronche de ton code, tu peux éventuellement gicler une ou deux des occurences de ton "...", mais ça dépend du "..." ...
Enfin je vais être plus explicite, si ton code est rigoureusement identique (*doute*) alors tu fous simplement le code après le if/switch...
Sinon on suppose que t'as une fonction fopen, fwrite (ou similaire) et fclose pour chaque type de fichier... Alors tu fais un truc du genre
[code]FOPEN_FUNCTION pfopen;
FWRITE_FUNCTION pfwrite;
FCLOSE_FUNCTION pfclose;
switch (format)
{
case normal:
pfopen = fopen;
pfwrite = fwrite;
pfclose = fclose;
break;
case compressé:
pfopen = fopen_cmp;
pfwrite = fwrite_cmp;
pfclose = fclose_cmp;
break;
}
ma_sous_fonction(pfopen, pfwrite, pfclose);[/code]
Plus généralement encore ça c'est l'équivalent C de ce qu'on ferait en C++ avec des classes... Et là ça peut se coder encore mieux que ça... Mais comme je sais pas si ton code est C ou C++ ...

il ne le modifie pas dans ce cas précis comme je l'ai écrit... Réfléchit 30s avant de dire ça... Il a dit que c'était exactement le même code, ok il c'est certainement trompé, mais il est ptet pas con non plus... si "..." modifie a alors il le modifie encore dans le deuxième if ? Mais c'est quoi l'intérêt tu m'explique ?
Ton post => poubelle
Bah son code est tres certainement en C (utiliser FILE en C++ c'est assez moisi)
Jyaif Le 15/07/2006 à 00:47 Et toi, tu comprends pas que "...[1]" peut inclure "format = compressé;" ?
cross...
insoo Le 15/07/2006 à 01:31 le H de chat aussi, paske cat c'est pareil
Le plus propre serait sans doute de passer par une classe File qui aurait deux classes dérivées, PlainFile et GzFile, et qui encapsulerait tes ouvertures/écritures de fichiers ^^ (et accessoirement ça te permettrait d'avoir le *close() fait automatiquement dans le destructeur, ce qui est nettement plus propre)
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
Zeph Le 15/07/2006 à 14:17 oui sauf que comme c'est peut-être pas lui qui a défini gzFile et FILE, pour les faire hériter d'une classe commune bah... ^^

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
euh, mais même les méthodes virtuelles et le fait d'hériter d'une classe commune ne sont pas indispensables, il suffit que mafonction() soit templaté ^^
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
Zeph Le 15/07/2006 à 16:46 j'ai pas dit que c'était indispensable, juste qu'en postant le #19 je n'avais pas vu de solution ^^

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
OK donc il vaut mieux créer une nouvelle classe qui gère les entrées et sorties. Effectivement c'est peut-être plus simple.
Des constructeurs du genre MaClass( FILE* fichier , const char* mode) et MaClass( gzFile fichier , const char* mode) , une fonction lire( unsigned long offset , unsigned long taille , void* buffer ) et ecrire(const void* buffer , unsigned long taille )
Je vais voir ça.
Merci bien, A+
C'est bon j'ai fait la classe en question et ça marche super!merci pour l'idée.
Je vous file les sources (même s'il n'y a rien d'extraordinaire)
#ifndef FILEIO_H
#define FILEIO_H
#include <stdlib.h>
#include <stdio.h>
#include <zlib.h>
//#include <iostream>
enum FILEIO_MODE {FILEIO_unset = -1, FILEIO_normal, FILEIO_gzip};
class FileIO
{
public:
FileIO(){this->mode=FILEIO_unset,this->file=NULL;};
FileIO( const char* , const char* , FILEIO_MODE = FILEIO_normal );
~FileIO();
void openFile( const char* , const char* , FILEIO_MODE = FILEIO_normal );
bool isFileOpened( void ){return this->file!=NULL;};
FILEIO_MODE getMode( void ){return this->mode;};
void write( const void* , unsigned long );
void read( unsigned long , void * , unsigned long );
void closeFile( void );
private:
void* file;
FILEIO_MODE mode;
};
#endif
#include "FileIO.h"
FileIO::FileIO( const char* filename , const char* option , FILEIO_MODE openmode )
{
this->openFile(filename,option,openmode);
}
FileIO::~FileIO()
{
this->closeFile( );
}
void FileIO::openFile( const char* filename , const char* option , FILEIO_MODE openmode )
{
if ( this->isFileOpened() || openmode == FILEIO_unset)
return;
if ( openmode == FILEIO_normal )
file = (FILE*)fopen(filename,option);
if ( openmode == FILEIO_gzip )
file = (gzFile)gzopen(filename,option);
if ( file != NULL )
this->mode = openmode;
}
void FileIO::write( const void* buffer, unsigned long length )
{
//cout << "\tTentative d'écriture de données" << endl;
if ( this->isFileOpened() && this->mode == FILEIO_normal)
fwrite(buffer,length,1,(FILE*)file);
if ( this->isFileOpened() && this->mode == FILEIO_gzip)
gzwrite((gzFile)file,buffer,length );
//cout << "\t\tdonnées écrites" << endl;
}
void FileIO::read( unsigned long position , void *buffer , unsigned long length )
{
if ( this->isFileOpened() && this->mode == FILEIO_normal)
{
}
if ( this->isFileOpened() && this->mode == FILEIO_gzip)
{
}
}
void FileIO::closeFile( void )
{
if ( this->isFileOpened() && this->mode == FILEIO_normal)
fclose((FILE*)file);
if ( this->isFileOpened() && this->mode == FILEIO_gzip)
gzclose((gzFile)file);
this->file = NULL;
}
Nota : il manque la fonction read, je ne l'ai pas encore faite (ceci dit c'est juste des fread ou gzread)
ah bon?!!?? là tu m'en apprends une bien bonne, je ne savais pas.
Je vais m'y pencher de plus près.
Est-ce que quelqu'un sait se servir de libtar? (la bibliothèque qui permet de faire des archives tar)
Je n'ai pas trouvé grand chose sur google et le peut d'exemple (me les man:/tar_open et co) ne sont pas d'une grande aide.