Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/06/2006, à 00:57

lost-in-the-shell

[Résolu] [C] Problème ouverture répertoire avec ~ dans le path

Salut,
A peu près toute la problèmatique est dans le sujet : je n'arrive pas à ouvrir un fichier qui se trouve dans un répertoire en passant par le répertoire virtuel ~ ( /home/utilisateurcourant ).
En l'occurence :

FILE * fichier = NULL;
fichier = fopen("/home/naji/.snake/niveau1.lvl", "r");
/* ... */

Fonctionne parfaitement, mais c'est pas la même chose pour :

fichier = fopen("~/.snake/niveau1.lvl", "r");

Le fichier que j'essaie d'ouvrir est exactement le même (comme vous pourrez vous en douter).
Si quelqu'un pouvait me renseigner sur la cause du problème et comment le contourner, ce serait sympa big_smile .

LITS.

Dernière modification par lost-in-the-shell (Le 14/06/2006, à 22:14)


Linux user #401253 - Ubuntu user #3023 .
Nick sur IRC : naji.
Pensez à adhérer au Comité de lutte contre le SMS.

Hors ligne

#2 Le 14/06/2006, à 01:25

Riicooo

Re : [Résolu] [C] Problème ouverture répertoire avec ~ dans le path

Une piste : je pense (et je n'en sais rien !) que la commande ~ n'est reconnue que dans une console (bash) ou dans un script... ce n'est pas une adresse 'physique'.
Une solution vraiment barbare tongue que je n'ai même pas testée :
#include <stdlib> // je crois.
system("cd ~;pwd > test.txt");// se placer dans le répertoire ~ et enregistrer son adresse dans le fichier test.txt.
et tu ouvre le fichier texte pour connaitre le nom du répertoire...

Une personne plus qualifiée que moi pourra mieux t'aider wink

Dernière modification par Riicooo (Le 14/06/2006, à 01:25)

Hors ligne

#3 Le 14/06/2006, à 07:41

Cathou

Re : [Résolu] [C] Problème ouverture répertoire avec ~ dans le path

C'est parfaitement résumé. Dans la doc de bash ils appellent ça un 'builtin'.

Une méthode un peu moins barbare smile qu'un fichier est de récupérer la variable d'environnement HOME au moyen de la fonction getenv():

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
   char *home;
   char relatif[] = "/.snake/niveau1.lvl";
   
   home = getenv("HOME");

   if(!home) return 1;

   printf("home: %s\n", home);
      
   char *absolu = malloc(strlen(home)+strlen(relatif)+1);
      
   strcat(strcpy(absolu,home),relatif);

   printf("absolu: %s\n", absolu);

   free(absolu);
   return 0;
}

La doc complète de la libc est ICI : cherche à 'environment variables'.
Si tu veux n'avoir à connaître qu'une seule lib naji, celle-ci est un bon choix smile

Dans ton exemple, initialiser le pointeur à NULL ne sert à rien. Mais c'est juste pour chipoter et essayer de me faire passer pour les personnes dont parle Riicooo.

#4 Le 14/06/2006, à 08:41

Riicooo

Re : [Résolu] [C] Problème ouverture répertoire avec ~ dans le path

Pas mal ! bon à savoir le getenv() smile.

Cathou a écrit :

Dans ton exemple, initialiser le pointeur à NULL ne sert à rien.

La déclaration et l'initialisation peuvent se faire en même temps d'ailleurs tongue, mais là c'est une question d'habitude/ de goût wink.

Hors ligne

#5 Le 14/06/2006, à 12:15

lost-in-the-shell_out

Re : [Résolu] [C] Problème ouverture répertoire avec ~ dans le path

Salut,
Je savais pas que ~ était une spécifité du Bash. J'ai pensé à un moment à :

system("cp ~/.snake/niveau1.lvl .");
fichier = fopen("niveau1.lvl", "r");
/* ... */

Mais j'avais un peu peur que ce soit barbare. Je vais dorénavant utiliser la concaténation avec getenv("HOME");

Merci pour le lien vers la libc, mais un man commande me suffit amplement.

Note : il y a une erreur dans le code de Cathou : il faut remplacer

malloc(strlen(home)+strlen(relatif)+1);

par

malloc(sizeof(char) * (strlen(home)+strlen(relatif)+1);

LITS, pas sur son Ubuntu, et donc pas loggé.

#6 Le 14/06/2006, à 15:25

Cathou

Re : [Résolu] [C] Problème ouverture répertoire avec ~ dans le path

sizeof(char)==1

C'est ton compilo qui t'apporte cette garantie.

#7 Le 14/06/2006, à 22:14

lost-in-the-shell

Re : [Résolu] [C] Problème ouverture répertoire avec ~ dans le path

Mouarf mouarf pas très X-Platform, cette affirmation hmm ...


Linux user #401253 - Ubuntu user #3023 .
Nick sur IRC : naji.
Pensez à adhérer au Comité de lutte contre le SMS.

Hors ligne

#8 Le 14/06/2006, à 22:44

Cathou

Re : [Résolu] [C] Problème ouverture répertoire avec ~ dans le path

Tu te trompes, c'est garanti par n'importe quel compilo ANSI:

sizeof(char) , sizeof(signed char) and sizeof(unsigned char) are 1

Ce qui ne veut pas dire pour autant qu'un char est un octet..

#9 Le 14/06/2006, à 22:47

lost-in-the-shell

Re : [Résolu] [C] Problème ouverture répertoire avec ~ dans le path

Au temps pour moi, merci pour l'info.


Linux user #401253 - Ubuntu user #3023 .
Nick sur IRC : naji.
Pensez à adhérer au Comité de lutte contre le SMS.

Hors ligne

#10 Le 15/06/2006, à 21:32

gene69

Re : [Résolu] [C] Problème ouverture répertoire avec ~ dans le path

Cathou tu m'apprend des trucs.

Ou est ce que tu as lu ça? Comment tu peux avoir la certitude que le compilateur est ANSI? (chipotons...)

sizeof(char) , sizeof(signed char) and sizeof(unsigned char) are 1

je me coucherais moins bête.

EDIT: ça ne fait rien de le mettre si cette valeur est constante. Normalement à l'optimisation ça disparait. et ça redevient portable ...

Dernière modification par gene69 (Le 15/06/2006, à 21:41)


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#11 Le 16/06/2006, à 01:02

Cathou

Re : [Résolu] [C] Problème ouverture répertoire avec ~ dans le path

Tu peux consulter cette FAQ (je sais, elle fait mal aux zeuilles) à la question 7.8

A titre perso, dès que je prends connaissance d'une garantie de ce genre j'hésite pas à l'utiliser si elle va dans le sens d'un allègement d'écriture. Et je n'utiliserai explicitement sizeof(char) que dans le cas où je veux faire remarquer quelque chose de particulier à celui qui reprendra mon code.

Comment tu peux avoir la certitude que le compilateur est ANSI?

C'est dans la doc du compilo.

Et s'il n'est pas ANSI (ex:compilo pour microcontrôleurs) il doit complètement expliciter à quel point il s'en écarte.

Mais en général, K&R est ton ami smile

#12 Le 17/06/2006, à 17:54

gene69

Re : [Résolu] [C] Problème ouverture répertoire avec ~ dans le path

Je chipotais sur le fait que plus tu mets ce genre de détails plus ton code est portable.

ensuite si tu pouvais m'expliquer le 8.9 wink je ne comprend pas trop la logique.


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#13 Le 18/06/2006, à 09:01

Cathou

Re : [Résolu] [C] Problème ouverture répertoire avec ~ dans le path

Au sujet de la 8.9, elle concerne les caractères constants et comme tu as pu le lire dans la réponse, c'est 'surprenant'.
Pourquoi ils ont décidé ça? Evidemment, ça a l'air contradictoire et franchement je suis incapable de t'apporter une justification.

Mon intuition me dit que c'est d'origine historique. Les gens qui ont inventé le C sont aussi ceux qui ont conçu les premières libs, en particulier d'entrées/sorties. Par exemple, si on prend le proto et la description de fgetc en man(3):

#include <stdio.h>

int fgetc(FILE *stream);

fgetc() reads the next character from  stream  and
returns  it  as  an unsigned char cast to an int,
or EOF on end of file or error.

Peut-être qu'ils ont voulu se simplifier la vie dans leurs premiers programmes de lecture dans un fichier (comparaison à EOF) et que ça a transpiré dans les specs de leur compilo..

Mais bon, pas de quoi s'empêcher de dormir la nuit smile

Si tu veux des explications pointues sur le langage, tu devrais poster sur comp.lang.c

En ce qui me concerne, j'y ai pas mis les pieds depuis longtemps et je m'en porte pas plus mal smile

#14 Le 18/06/2006, à 12:39

gene69

Re : [Résolu] [C] Problème ouverture répertoire avec ~ dans le path

Merci...


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne