LIRE OU ÉCRIRE UN FICHIER SUR DISQUE DUR, FTP OU HTTP DE MANIERE TRANSPARENTE
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
21 mars 2005 à 22:54
BumpMANN
Messages postés330Date d'inscriptionjeudi 22 mai 2003StatutMembreDernière intervention26 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.
BumpMANN
Messages postés330Date d'inscriptionjeudi 22 mai 2003StatutMembreDernière intervention26 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és330Date d'inscriptionjeudi 22 mai 2003StatutMembreDernière intervention26 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és330Date d'inscriptionjeudi 22 mai 2003StatutMembreDernière intervention26 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és76Date d'inscriptionlundi 21 mars 2005StatutMembreDernière intervention29 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és46Date d'inscriptionvendredi 14 janvier 2005StatutMembreDernière intervention31 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és688Date d'inscriptionmercredi 6 avril 2005StatutMembreDernière intervention 2 juin 20061 21 sept. 2005 à 18:00
bienbien
j' ai bien kiffé :-)
8/10
darkpoulpo
Messages postés76Date d'inscriptionlundi 21 mars 2005StatutMembreDernière intervention29 novembre 2009 30 avril 2005 à 17:22
recupere la derniere version, je me suis apercu dun bogue auj!
CChargy
Messages postés126Date d'inscriptionsamedi 24 avril 2004StatutMembreDernière intervention 6 janvier 2008 30 avril 2005 à 14:52
Merci
J'espère que ca va marcher
darkpoulpo
Messages postés76Date d'inscriptionlundi 21 mars 2005StatutMembreDernière intervention29 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és76Date d'inscriptionlundi 21 mars 2005StatutMembreDernière intervention29 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és126Date d'inscriptionsamedi 24 avril 2004StatutMembreDerniè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és76Date d'inscriptionlundi 21 mars 2005StatutMembreDernière intervention29 novembre 2009 29 avril 2005 à 11:26
dit moi ce qui ton probleme, ce sera mieux
darkpoulpo
Messages postés76Date d'inscriptionlundi 21 mars 2005StatutMembreDernière intervention29 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és126Date d'inscriptionsamedi 24 avril 2004StatutMembreDerniè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és76Date d'inscriptionlundi 21 mars 2005StatutMembreDernière intervention29 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és126Date d'inscriptionsamedi 24 avril 2004StatutMembreDerniè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és76Date d'inscriptionlundi 21 mars 2005StatutMembreDernière intervention29 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 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).
C'est la meme chose avec memcpy qui peut etre inliner par une simple affectation.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 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és3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
3 juin 2007 à 03:16
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à...
3 juin 2007 à 02:47
c'est a dire que pour ton exemple, il faudrait:
...
unsigned char tampon[10197];
int lu=down.fread(tampon,1,10196);
...
3 juin 2007 à 01:28
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
15 déc. 2006 à 01:31
3 mars 2006 à 18:54
21 sept. 2005 à 18:00
j' ai bien kiffé :-)
8/10
30 avril 2005 à 17:22
30 avril 2005 à 14:52
J'espère que ca va marcher
29 avril 2005 à 20:03
29 avril 2005 à 20:01
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é?
29 avril 2005 à 12:35
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
29 avril 2005 à 11:26
29 avril 2005 à 11:24
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, ....)
28 avril 2005 à 14:29
Sinon, dans laquelle?
Merci d'avance
Colin CHARGY
27 avril 2005 à 12:37
(dit toi que c'est comme si tu utilises stdio.h, ca revient au meme)
26 avril 2005 à 09:50
dans un fichier?
dans une variable?
merci d'avance
Colin
23 mars 2005 à 16:11
relisez la description tout en haut.
22 mars 2005 à 21:33
22 mars 2005 à 21:05
strcpy( s, "hello" ); // inline
strcpy( s1, s2 ); // call strcpy
C'est la meme chose avec memcpy qui peut etre inliner par une simple affectation.
22 mars 2005 à 20:35
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.
22 mars 2005 à 20:07
Compares le code généré par
strcpy(path,""); et path[0] = 0;
mais sur la forme tu as raison.
22 mars 2005 à 15:58
21 mars 2005 à 22:54
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.