LIRE OU ÉCRIRE UN FICHIER SUR DISQUE DUR, FTP OU HTTP DE MANIERE TRANSPARENTE

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 21 mars 2005 à 22:54
BumpMANN Messages postés 330 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 26 janvier 2009 - 3 juin 2007 à 03:16
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/30246-lire-ou-ecrire-un-fichier-sur-disque-dur-ftp-ou-http-de-maniere-transparente

BumpMANN Messages postés 330 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 26 janvier 2009
3 juin 2007 à 03:16
je continue, désolé de poster autant ^^; mais je découvre des choses au fur et a mesure...

pour fgets, pour les fichiers, il faudrait renvoyer la vraie valeur de retour du fgets standard (en cas d'erreur par exemple...) donc:

char *CFileX::fgets(char *string, int num)
{
if (!Web) {
char *t;
int i=0;
t=::fgets (string , num , pFile);

if (t == NULL)
return NULL;

...


Et pour en revenir a mon précédent post, ce qui fait planter dans fread, c'est:

pos += lu;
((char *)buffer)[pos] = '\0';

qui devrait etre:

pos += lu;
((char *)buffer)[pos - 1] = '\0';


Voilà...
BumpMANN Messages postés 330 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 26 janvier 2009
3 juin 2007 à 02:47
hmmm... j'ai pas regardé ton code plus en détail, mais apparament, ton fread prend un octet de trop ^^ (en http en tout cas);

c'est a dire que pour ton exemple, il faudrait:

...
unsigned char tampon[10197];
int lu=down.fread(tampon,1,10196);
...
BumpMANN Messages postés 330 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 26 janvier 2009
3 juin 2007 à 01:28
dans fopen:

if (sscanf(filename,"%[^:]:\\%[^\0]",host,path) < 2)
{
strcpy(host,"");
if (sscanf(filename,"%s",path) < 1)
return NULL;
}

plutot que:

if (sscanf(filename,"%[^:]:\\%[^\0]",host,path) != 2) { ... }

permet d'avoir en argument un chemin relatif pour les fichiers... plus pratique ^^ ( en fait je me demandais pourquoi ca buggait chez moi...)

Mais sinon, excellente classe, et bonne idée! 9/10
darkpoulpo Messages postés 76 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 29 novembre 2009
15 déc. 2006 à 01:31
tu as du te planter dans les arguments de fopen(), je me souviens que l'exemple marchait, et jusqu'a present ca marche
Mattpbem Messages postés 46 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 31 juillet 2006
3 mars 2006 à 18:54
je ne sais pas pourquoi mais le code exemple n'ecrit aucun fichier mais lit un fichier par http sans probléme j'ai donc du remplacer l'ecriture par des appels normaux de "stdio"
cs_satellite34 Messages postés 688 Date d'inscription mercredi 6 avril 2005 Statut Membre Dernière intervention 2 juin 2006 1
21 sept. 2005 à 18:00
bienbien

j' ai bien kiffé :-)

8/10
darkpoulpo Messages postés 76 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 29 novembre 2009
30 avril 2005 à 17:22
recupere la derniere version, je me suis apercu dun bogue auj!
CChargy Messages postés 126 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 6 janvier 2008
30 avril 2005 à 14:52
Merci
J'espère que ca va marcher
darkpoulpo Messages postés 76 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 29 novembre 2009
29 avril 2005 à 20:03
ya une erreur de parametre, c down.fgets(tampon,10196); quil fo mettre ds la boucle
darkpoulpo Messages postés 76 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 29 novembre 2009
29 avril 2005 à 20:01
c'est un fichier texte? si c'est le change la boucle de l'exemple du haut par :

while (!down.eof() && !sauve.eof()) {
unsigned char tampon[10196];
down.fgets(tampon,1,10196);
// ici tu analyses la ligne recuperé dans tampon
// pour faire le decoposé en differente partie
// ou alors tu stockes tampon dans un
// std::string latotal=""; definie en dehors de la
// boucle , et dans la boucle tu fais un latotal += string(tampon);
}



t'as pigé?
CChargy Messages postés 126 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 6 janvier 2008
29 avril 2005 à 12:35
C'est simple:
Je voudrait lire un fichier sur un serveur et le mêtre dans une variable, le décomposer en différentes partie et mettre a jour des variables de mon programme en fonction de ce fichier. Pour un jeu en réseau avec PHP
Merci d'avance
Colin CHARGY
darkpoulpo Messages postés 76 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 29 novembre 2009
29 avril 2005 à 11:26
dit moi ce qui ton probleme, ce sera mieux
darkpoulpo Messages postés 76 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 29 novembre 2009
29 avril 2005 à 11:24
oué dans Tampon, mais que le temps de la boucle, apres c'est remplacé par la prochaine lecture de fread() ou fgets()

donc tas pas 10 choix,
1) soit tu stock dans un fichier au fur et a mesure
2) soit tu stockes dans une variable dynamique (par stl par exemple)
3) soit tu connais la taille de ce que tu lis et tu stockes ca ou tu veux (ex: au 1er fred() dans la structure header dun tga, le seond fread() ds la structure machin du tga, ....)
CChargy Messages postés 126 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 6 janvier 2008
28 avril 2005 à 14:29
Les données sont stocker dans la variable Tampon, non?
Sinon, dans laquelle?
Merci d'avance
Colin CHARGY
darkpoulpo Messages postés 76 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 29 novembre 2009
27 avril 2005 à 12:37
bein dans lexemple que jai fournis en haut, je stocke dans un fichier, mais rien ne tempeches par exemple lire un fichier targa en live en stockant directement en memoire dans les structures targa

(dit toi que c'est comme si tu utilises stdio.h, ca revient au meme)
CChargy Messages postés 126 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 6 janvier 2008
26 avril 2005 à 09:50
ou vont les donnés recupérés?
dans un fichier?
dans une variable?

merci d'avance
Colin
darkpoulpo Messages postés 76 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 29 novembre 2009
23 mars 2005 à 16:11
jai fais une mise à jour (jai rajouté en plus le ftp)
relisez la description tout en haut.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 mars 2005 à 21:33
Un compilo moderne les met toujours inline, on peut considérer comme macro, c'est le cas pour VC++ depuis la version 6 (1998 c'est pas hier).
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
22 mars 2005 à 21:05
non ce ne sont pas des macros ! ce sont juste des fonctions out of line (code dans la libc) que le compilateur sait inliner dans certains cas (chaines litterales).

strcpy( s, "hello" ); // inline
strcpy( s1, s2 ); // call strcpy

C'est la meme chose avec memcpy qui peut etre inliner par une simple affectation.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 mars 2005 à 20:35
Mais je répète ici depuis longtemps que strcpy etc ne sont pas des fonctions mais des macros car code est mis inline. Pour autant ce sont bien des boucles.
Dans le cas d'un simple octet à placer comme plus haut, j'espère bien que le compilo l'aura vu et n'aura pas mis la boucle.
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
22 mars 2005 à 20:07
BruNews, tu seras surpris de voir que les fonctions de la bibliothèque standard peuvent avoir un inlining predefinis (elles sont considèrées par le compilateur comme intrinsèques au langage)

Compares le code généré par

strcpy(path,""); et path[0] = 0;

mais sur la forme tu as raison.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
22 mars 2005 à 15:58
Intéressant comme projet, la transparence permet bien des choses. Je verrai ça si j'ai le temps.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 mars 2005 à 22:54
Dans le constructeur:
strcpy(path,"");
strcpy(host,"");
strcpy(protocole,"");
strcpy(file,"");

path[0] = 0; // idem pour lres autres
inutile de générer des boucles strcpy pour placer un octet.
Rejoignez-nous