Programmation C - dossier d'enregistrement fprintf

Metaluca

Membre enregistré
7 Juin 2011
5
0
Bonjour,

Étant débutant sur un Mac, j'ai un problème pour adapter mon programme C développé sur windows, notamment en ce qui concerne l'enregistrement d'un fichier avec fprintf.

Je développe sous xcode 3.1.3, avec un projet type Command Line Utility / Standard tool

Mon programme est censé enregistrer un fichier dans le dossier ou l’exécutable est lancé.
Dans Windows, je n'ai pas besoin de définir de chemin d’accès pour faire cela
(ex: fdata=fopen("nomdufichier","wt");)

Si je garde la commande tel quel sur le mac, le fichier est crée à la base du dossier users actuel.

Comment doit-je faire pour que le fichier soit enregistrer dans le bon dossier? (sans avoir à taper le chemin d’accès du dossier).

Merci pour votre aide
 
Bonjour et bienvenue sur MacGé' :coucou:

Sous Windows comme sous Mac OS X, en l'absence de spécification du chemin, on écrit et on lit par défaut dans le « dossier courant », lequel est défini dans l'environnement de l'exécutable et peut être modifié à volonté par le programme.

Comme pour toutes les valeurs par défaut, s'en remettre à la valeur supposée du dossier courant implique un certain nombre d'hypothèses sur les conditions dans lequel le programme est utilisé. On ne peut donc s'en prendre qu'à soi-même si le programme ne se comporte plus comme prévu parce que le comportement diffère du fait des modifications de ces conditions. Ton hypothèse de départ «je suis sous Windows» n'est plus valable.

Bref, si tu souhaites que ton programme fonctionne de la même manière sur toutes les plateformes, il t'appartient de spécifier clairement dans ton programme le dossier dans lequel tu souhaites travailler, soit en modifiant expressément le dossier courant, soit en indiquant le chemin complet du fichier lors de son ouverture.

Il faudrait préciser ce que tu entends par « le dossier où l’exécutable est lancé » pour déterminer la façon adéquate de l'obtenir.
 
Dernière édition:
L’exécution du programme doit se faire part un simple double clic et justement, j'aimerai que le programme écrit et lit dans le dossier courant.
Peut être y a-t-il une configuration spécifique de xcode pour faire cela?

Lorsque je lance mon programme, la fenêtre affiche cela:

Last login: Tue Jun 7 11:43:27 on ttys000

/Users/***/Documents/Datas/ZnO\ Crystal\ Builder\ for\ Mac/build/Debug/ZnO\ Crystal\ Builder\ for\ Mac ; exit;

iMac-equipe:~ ***$ /Users/***/Documents/Datas/ZnO\ Crystal\ Builder\ for\ Mac/build/Debug/ZnO\ Crystal\ Builder\ for\ Mac ; exit;

ZnO Crystal Builder ... (c'est le 1er printf du programme)
je remarque qu'il y a un exit après l'ouverture du fichier, est-ce la source du problème?

PS: je ne souhaite pas forcement être multiplateforme
 
Ce qui se passe, c'est que tu lances la commande depuis l'environnement graphique, pour lequel la notion de « dossier où l’exécutable est lancé » n'a pas de sens.

Lorsque tu double-cliques sur le fichier exécutable de ta commande dans le Finder, cela a pour effet d'ouvrir une fenêtre Terminal sur le dossier utilisateur du compte de la session (i.e. la petite maison), puis d'y exécuter ta commande, immédiatement suivie par un « exit » afin de clore l'opération. Le « fopen » de ta commande crée naturellement le fichier dans le dossier courant de la fenêtre Terminal, qui est par conséquent le dossier utilisateur du compte de la session.

En revanche, si tu ouvres une fenêtre Terminal, que tu te rends dans un dossier de ton choix à l'aide de « cd », puis que tu tapes le chemin et le nom de ta commande afin de l'exécuter, le fichier créé par « fopen » le sera bien dans le dossier courant que tu as choisi... tout comme sous Windows dans une fenêtre CMD.
 
Dernière édition:
Cela ne fonctionne pas également, mais peut être cela est due au faite que lors de l’exécution avec open "ZnO Crystal Builder", le programme s’exécute dans une autre fenêtre terminal est un message similaire au précédent apparait (la ligne /users/***... en moins)

edit: je viens de trouver une solution (que je ne comprend qu'a moitié)
une fois que je suis dans le dossier qui m'interesse, au lieu d'utiliser open "...", je fait un glisser déposer dans la fenêtre terminal et appuie sur entrer. le fichier est alors enregistrer au bon emplacement.

Je pense donc que le problème vien de la commande open qui n'est peut être pas adapté
 
Dernière édition:
Cela ne fonctionne pas également, mais peut être cela est due au faite que lors de l’exécution avec open "ZnO Crystal Builder", le programme s’exécute dans une autre fenêtre terminal est un message similaire au précédent apparait (la ligne /users/***... en moins)
Qu'entends-tu par «dans une autre fenêtre» ? Comment lances-tu l'exécution du programme ?

Je pense donc que le problème vien de la commande open qui n'est peut être pas adapté
Comme je l'ai expliqué, c'est la façon d'exécuter la commande qui fait toute la différence. Si l'exécution provoque l'ouverture préalable d'une nouvelle fenêtre Terminal alors le fichier sera créé dans le dossier principal de l'utilisateur (qui est le dossier courant par défaut), et si la commande est lancée depuis une fenêtre Terminal déjà ouverte alors le fichier sera créé dans le dossier courant de cette fenêtre.

Pour garantir le fonctionnement que tu souhaites en toutes circonstances, il faut que tu passes à la fonction « fopen » le chemin complet du fichier à créer. D'ailleurs, en te posant la question de savoir comment obtenir ce chemin, tu comprendras certainement que la notion de « dossier où l’exécutable est lancé » n'a rien d'évidente et qu'il convient de donner une définition plus précise de ton besoin.
 
Dernière édition:
Qu'entends-tu par «dans une autre fenêtre» ? Comment lances-tu l'exécution du programme ?

Aprés mettre rendu dans le dossier désirée à l'aide de cd (donc dans le terminal), je lance l’exécutable en tapant la commande: open "ZnO Crystal Builder" (ZnO Crystal Builder est le nom de l’exécutable)

Un nouveau terminale s'ouvre avec le programme en exécution à l’intérieur qui lui s’exécute dans le dossier user
 
Ok...

La commande « open » sert à demander au système d'ouvrir un fichier en déterminant lui-même son type afin d'exécuter le programme adéquat. Par exemple, dans une configuration standard, si ce fichier est une image alors c'est Aperçu qui sera exécuté, si c'est une vidéo ce sera Quicktime Player, si c'est un dossier ce sera Finder, et si c'est un lien Internet ce sera Safari.

Dans le cas présent le système détecte que le fichier est un programme en ligne de commande, alors il lance Terminal et demande à ce dernier de traiter le fichier.


Mais cette façon de faire est très indirecte, et ne correspond pas à celle qu'on utilise habituellement : pour lancer une commande dans Terminal, on se contente de tape le chemin (relatif ou absolu) de son fichier. Lorsque le fichier de la commande est situé dans le dossier courant, on doit tout de même préciser ce dossier dans le chemin (on tape « ./nom_de_la_commande »).

Tu devais donc lancer ta commande en tapant par exemple :
"/Users/***/Documents/Datas/ZnO Crystal Builder for Mac/build/Debug/ZnO Crystal Builder for Mac"
(la présence des doubles cotes encadrantes permet d'inclure des espaces dans le chemin). Glisser le fichier dans la fenêtre Terminal depuis Finder revient au même.

Et tu verras que dans ce cas, le fichier sera bien créé dans le dossier courant.
 
Dernière édition:
j'aurais jamais penser utiliser le ./ à ce moment la ... et du coup je comprend mieux pourquoi ça fonctionnait pas

En tout cas, merci pour ton aide