Probleme avec FILE

sidewalker Messages postés 20 Date d'inscription lundi 11 août 2003 Statut Membre Dernière intervention 11 juin 2009 - 24 oct. 2004 à 13:56
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 24 oct. 2004 à 18:39
J'ai un petit probleme... La compilation s'opère sans probleme mais lors de l'exécution ça ne s'affiche pas correctement.
En fait, lorsque je tape le chemin d'accès, le programme se ferme. (????)

Merci à celui qui m'aidera

printf("Veuillez specifier le chemin d'acces à votre map Ragnarok:\n");
textbackground(BLACK);
printf("# Attention, ce fichier se doit être d'extension .gat\n");
scanf("%s", &path);

// Vérification des handles
FILE * fmap;

fmap= fopen(path, "r");
if(fmap == NULL) {
printf("Echec de chargement\n");
getchar();

}
else {

printf("Fichier ouvert!");
getchar();

}

Now that's sidewalker's era

15 réponses

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
24 oct. 2004 à 14:20
Normal si tu executes le programme compilé sous windws.
Ouvre une console MS-DOS et execute le dedans.

Shell
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
24 oct. 2004 à 14:25
Pour t'expliquer ce qu'il se passe :
Quand tu entres le nom du fichier, tu valides en tappant ENTRER, qui valide ton choix mais qui reste aussi dans la cache.
Ensuite le getchar, récupere bel et bien le ENTRER, mais le la valide a nouveau car ENTRER equivaut à un retour chariot couplé à un retour a la ligne.

Si tu veux tout de meme pouvoir utiliser ton programme en mode GUI, tu dois vider la cache après avoir récuperer la saisie utilisateur.

Exemple:
printf("Chemin : ");
scanf("%s", &path);
fflush(stdin);
getchar(); //Tu peux aussi mettre systeme pause mais a ce compte la tu peux virer le fflush(stdin).


Shell
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
24 oct. 2004 à 15:22
Moi ce serait plutot l'instruction scanf("%s", &path); qui m'inquiéterais... Surtout quand je vois ensuite fopen(path, "r");
path est sans doute un char*, donc c'est path qu'il faut donner à scanf et pas son adresse
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
24 oct. 2004 à 15:43
vecchio56> ca revient au meme.
Si path est déclarée "char *path;" ou "char path[MAX_PATH]";
que tu indiques &path ou path reviens au meme, car dans les deux cas tu donnes l'adresse du premier élément de path.

Shell
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
24 oct. 2004 à 15:48
Je pense qu'il y en a un de nous deux qui n'est pas bien réveillé...
0
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
24 oct. 2004 à 15:49
fflush(stdin);

J'en ai marre de voir ça, ça fait au moins la 10ème fois que je vois cette idiotie, écrite par plusieurs personnes différentes qui plus est !
fflush s'applique aux flux de sortie uniquement, pour un flux d'entré, c'est indéfini !!! (probablement désastreux)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
24 oct. 2004 à 15:52
(path == &path) vrai si path est un tableau, faux si path est un pointeur
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 oct. 2004 à 17:12
plus_plus_fab > entierement d'accord, je le repete moi meme souvent

le probleme c'est que ms à eu la 'bonne' idée d'implémenter fflush( ) et pas facile de faire comprendre que ce comportement n'est pas standard, donc pas portable et dangereux

on pourrait rajouter un fflush( stdout ) pour forcer l'affichage avant le scanf

et faire un fgets pour saisir une chaine et banir scanf et gets, toujours à cause du risque d'overflow
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
24 oct. 2004 à 17:43
FFLUSH()
Fonction : 
Vide la mémoire tampon associée à un flux.

Syntaxe : i
nt fflush(FILE *stream);

Ptototype dans : 
stdio.h

Description : 
Lorsque stream est un flux ouvert pour des sorties, fflush() entraine l'ecriture du contenu de la mémoire tampon associée au flux.

Lorque stream est un flux ouvert pour des entrées, la mémoire tampon est vidée.

Le flux stream reste ouvert après l'execution de fflush. cette fonction n'a pas d'effet sur les flux n'utilisant pas de mémoire tampon.

Valaur retournée : 
Retourne 0 si l'opération réussit et EOF lorsqu'une erreur est detectée.

Portabilité : 
Disponible sur les systèmes Unix : compatible avec la norme ANSI du langage C.


Shell
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
24 oct. 2004 à 17:47
Ou t'a trouvé ca?
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
24 oct. 2004 à 18:23
Sur un bouquin de C, qu'en donne en IUT info.

Shell
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
24 oct. 2004 à 18:27
Dans le mien c'est écrit ce disent djl et plus_plus_fab
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 oct. 2004 à 18:33
ce qui comte

c ansi <-> k&r ed ansi, et il est dit que fflush a un effet indeterminé sur un flux d'entré

DeAtHCrAsH > c'est quoi les references du bouquin ?
prends plutot le k&r, ya moins de mythes
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 oct. 2004 à 18:38
fputs( "chemin : ", stdout );
fflush( stdout );
fgets( path, sizeof path, stdin );

path doit etre un plateau
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 oct. 2004 à 18:39
un tableau (pas un plateau)
0
Rejoignez-nous