CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Question sur l'utilisation de fopen.

playstate
playstate
Niveau 9
15 février 2011 à 21:02:30

Bonjour à tous !
Dans mon petit programme que je suis entrain de faire j'utilise fopen pour ouvrir un fichier, mais, pour définir le nom du fichier à ouvrir je fait intervenir une fonction qui renvoie une chaine de caractère.
Je poste le code :

// include etc...

int main ( int argc, char** argv )
{
FILE *map = NULL;
printf ("%s", chargeFichier("Ressource/Map editeur/",mapActuel.nomMap));
map = fopen( chargeFichier("Ressource/Map_ editeur/",mapActuel.nomMap),"r");

fclose(map);

}

char* chargeFichier(char emplacement[], char nomFichier[])
{
char chaine[100] = {0};
sprintf(chaine,"%s%s",emplacement,nomFichier);

return chaine;

}

Donc le but de la fonction est de regrouper deux chaines (l'emplacement du fichier sur le disque dur ainsi que le nom du fichier) dans une même chaine pour pouvoir ouvrir le fichier.
Donc je test mais le programme n'arrive pas à ouvrir le fichier (le fichier existe pourtant bien).
J'ai essayé de mettre un printf pour voir la valeur de la chaine et elle s'avère exacte mais pourtant le fichier n'arrive pas à s'ouvrir.

Donc voila si quelqu'un peut m'expliquer ce phénomène :)
Merci.

KouicKouic
KouicKouic
Niveau 6
15 février 2011 à 21:42:16

Bonjour,
La premiere chose qui me choque c'est que ta fonction "chargeFichier" renvoi un pointeur sur une chaine de caractere dont la portée est limitée a cette fonction. Donc, une fois sortie de ta fonction "chargeFichier" tu ne dois pas y avoir acces.
Dans ce cas précis, ca marche peut etre puisque il n'y a pas d'autre allocation sur le stack (tres important de savoir ce que c'est), mais c'est jouer avec le feu de faire ca.

Alloue une chaine statique dans main et fait passer le pointeur en argument dans ta fonction "chargeFichier" pour la manipuler.

playstate
playstate
Niveau 9
16 février 2011 à 17:52:12

En fait j'avais fait la fonction pour éviter de faire des chaines à envoyer en argument et ainsi, ne pas en créer pleins.
Donc si je peut me passer de les envoyer c'est mieux :-)
Mais si je n'ai pas le choix je ferais avec.
Merci déjà pour la réponse.

KouicKouic
KouicKouic
Niveau 6
17 février 2011 à 07:10:05

Rien ne t'empeche de concatener 2 chaines A et B et de laisser le resultat dans A ou encore d'allouer un espace memoire dynamique ( dans le heap ('tas' en francais)) :

char* chargeFichier(char* emplacement, char* nomFichier)
{
char* total;
size_t totalLength;

total= NULL;
if(emplacement!=NULL && nomFichier!=NULL) {

totalLength = strlen(emplacement)+strlen(nomFichier)+1; /*+1 pour le /0 */
total = (char*) malloc(totalLength);

strcpy(total, emplacement);
strcat(total, nomFichier);
}

return total;
}

Bien entendu, il faudra faire un free() de la valeur retournee si non NULL.

Ou encore, pour avoir du plus simple et propre utiliser du C++ et le std::string.

playstate
playstate
Niveau 9
19 février 2011 à 21:25:05

Ok et bien merci bien pour tes réponses :-)))

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment