IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Chemins accentués et fopen


Sujet :

C

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 608
    Par défaut Chemins accentués et fopen
    Bonjour

    Ceci est un problème que j'ai sous Windows : un accent dans un chemin et fopen plante.
    Je récupère le nom du fichier par l’intermédiaire d'une boite de dialogue gtk. Avec un printf, je peux voir que le chemin est correct. Mais, s'il y a un accent dans le chemin, je ne peux ouvrir le fichier, c'est comme si le fichier n'existait pas. Que faire pour résoudre ce problème ?

    En renommant Téléchargement en Telechargement, ça marche.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 786
    Par défaut
    _wfopen avec des wchar_t (UTF-16) (<- non officiel, spécial Windows et lien vers la documentation)

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 608
    Par défaut
    Ça m'arrange guère à mon avis car je fais de la compilation croisée. Je suis sous Linux et je compile avec mingw-gcc. Il faudrait que MS offre un système compatible s'il veut qu'on développe pour lui

    nb1 : j'arrive péniblement à ouvrir cette page ! Pourquoi ?
    nb2 : des recherches m'envoient vers wcstombs ( Convertir une chaîne de caractères étendus en chaîne de caractères multioctets ). Est-ce une bonne idée ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 786
    Par défaut
    Je vais te répondre rapidement parce que je n'ai pas le temps de vérifier

    Mais il faudrait vérifier si fopen accepte des chaînes UTF-8 : il faudrait essayer en échappant les caractères

    Exemple d'1 chaîne UTF-8: "L'application ne peut \xC3\xAAtre ex\xC3\xA9""cut\xC3\xA9""e qu'une seule fois"

    Regarde sur cette page \x \u \U pour t'aider

    Et ensuite savoir pourquoi Windows rejette le caractère: il veut de l'UTF-8 et tu lui donnes de l'ANSI, ou il veut de l'ANSI et tu lui donnes de l'UTF-8


    Édit: recherche sur les Internets _wfopen (avec un tiret bas) et trouve le lien MSDN. Mais apparement tu t'en fiches

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 608
    Par défaut
    Bonjour

    Je vais faire des essais dès que possible. Merci.

    nb 1 : ce n'est pas que je m'en fiche, j'ai même testé : ça a compilé sous linux ! Mais par contre, je n'arrive pas à le faire marcher avec mon simulateur windows et je ne comprends pas les nouveau char qu'il faut utiliser...
    nb 2 : j'ai (eu ?) de gros problèmes pour accéder à cette page de dvp.com, elle refuse(ait?) de s'ouvrir. Je viens enfin d'y arriver !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,

    oui j'ai également énormément de problèmes avec dvp en ce moment.
    Sinon, comme tu utilises gtk+, le module GIO ne s'occupe-t-il pas de ça normalement (transformation encoding interne vers/de encoding fs) ?

  7. #7
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 608
    Par défaut
    Je viens de faire des essais, on dirait que ça marche avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char * chemin_utf;
    gsize taille_sortie;
    chemin_utf=g_locale_from_utf8 (chemin,-1,NULL,&taille_sortie,NULL);
    printf("chemin : %s, sortie : %s taille : %dn",chemin,chemin_utf,taille_sortie);
             fichier = fopen(chemin_utf, "rb");
    g_free(chemin_utf);
    Maintenant, il va falloir que je regarde où insérer ceci dans mon programme.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    A priori, dans une fonction fopen_utf8

  9. #9
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 608
    Par défaut
    J'ai voulu aussi dire qu'il va falloir que je relève tous les "fopen" de mon programme (20 000 lignes...) et que je vois comment gérer le problème.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  10. #10
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    find, voir grep.
    A priori, tu n'as pas 20000 fopen.

    Au pire une dizaine. Si ce n'est pas le cas, il est probable qu'il manque une boucle ou une fonction…

  11. #11
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Si tu utilises gcc → #pragma GCC poison fopen

  12. #12
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 608
    Par défaut
    Pour trouver des termes dans une arborescence, j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fn() { grep --color -r "$1" * 2>/dev/null; }
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     fn fopen | grep fopen
    dieux.c:                        fichier=fopen(s,"w");
    enregistre.c:    fp = fopen(nom_de_fichier, "rb");
    enregistre.c:         fichier = fopen(ch, "rb");
    enregistre.c:            fichier=fopen(nom_de_fichier,"r");
    enregistre.c:        fichier = fopen(_perso->perso.nom_fichier, "rb");
    enregistre.c:            fichier=fopen(nom_de_fichier,"r");
    enregistre.c:    fichier = fopen(_perso->perso.nom_fichier, "rb");
    enregistre.c:    fichier = fopen(_perso->perso.nom_fichier, "w");
    envp.c:        fp = fopen(aff, "rb");
    envp.c:         fp = fopen(aff, "w");
    envp.c:        fp = fopen(aff, "r");
    envp.c:         fp = fopen(aff, "w");
    envp.c:    /*fp = fopen(aff, "r");*/
    envp.c:    fp = fopen(aff, "w");
    envp.c:        fp = fopen(aff, "r");
    envp.c:        fp = fopen(aff, "w");
    envp.c:        fp = fopen(aff, "r");
    envp.c:    fp = fopen(ch, "rb");
    gestion_fenetre_perso.c:         fichier = fopen(chemin, "rb");
    gestion_fenetre_perso.c:         fichier = _wfopen(chemin, L"rb");
    groupe.c:    fichier = fopen(aff, "rb");
    groupe.c:    fichier = fopen(ch, "rb");
    groupe.c:    fichier = fopen(ch, "w");
    groupe.c:        fichier=fopen(nom_de_fichier,"r");
    groupe.c:        fichier=fopen(nom_de_fichier,"r");
    groupe.c:    fp = fopen(nom_de_fichier, "rb");
    utile.c:            src = fopen(path_src, "rb");
    utile.c:                dest = fopen(path_dest, "wb");
    xml.c: FILE * sortie=fopen(nom_fic,"w");
    xml.c:    sortie = fopen(ch,"w");
    remarque : je mets le grep final pour virer les lignes du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fichier binaire perso.exe correspondant
    nb : après recherche ceci semble une boutade :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #pragma GCC poison fopen#pragma GCC poison fopen
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  13. #13
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Citation Envoyé par troumad Voir le message
    ...

    nb : après recherche ceci semble une boutade :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #pragma GCC poison fopen#pragma GCC poison fopen
    En général j'essaye de ne pas raconter de conneries →
    Citation Envoyé par la doc de gcc
    #pragma GCC poison
    Sometimes, there is an identifier that you want to remove completely from your program, and make sure that it never creeps back in. To enforce this, you can poison the identifier with this pragma. #pragma GCC poison is followed by a list of identifiers to poison. If any of those identifiers appears anywhere in the source after the directive, it is a hard error. For example,
    #pragma GCC poison printf sprintf fprintf
    sprintf(some_string, "hello");
    will produce an error.

    If a poisoned identifier appears as part of the expansion of a macro which was defined before the identifier was poisoned, it will not cause an error. This lets you poison an identifier without worrying about system headers defining macros that use it.
    cf la doc gcc (partie cpp).

    Au moins tu es certain de ne pas en oublier si leur simple présence provoque une erreur lors de la compilation … ptêt même que ça empècherait leur utilisation par inadvertance …

  14. #14
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 608
    Par défaut
    OK !
    Je croyais que tu proposais une astuce pour réparer. J'avais bien compris que ça empêchait de compiler, mais, pour ma part, je cherche à compiler. Et pour la version Linux, je vais laisser un fopen naturel. Pour windows, il y aura toujours un fopen, mais, il sera entouré des astuces que j'ai trouvées.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  15. #15
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 608
    Par défaut
    Finalement, l'idée de regarder les bibliothèques gtk fut la bonne idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -ie 's/fopen/g_fopen/g' *.c
    Mais, il va falloir que je regarde autre chose sur https://developer.gnome.org/glib/sta...s.html#g-fopen , je lis :
    Thus if the GLib-using code uses a different C library than GLib does, the FILE* returned by this function cannot be passed to C library functions like fprintf() or fread().
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

Discussions similaires

  1. problème chemins accentués
    Par katorps dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 08/12/2012, 18h38
  2. CreateFile ou fopen? chemin plusieurs dossiers
    Par James_ dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/08/2007, 18h33
  3. chemin d'acces fopen
    Par hedi07 dans le forum Langage
    Réponses: 2
    Dernier message: 20/05/2007, 19h36
  4. problème de chemin avec la fonction fopen
    Par stars333 dans le forum Langage
    Réponses: 3
    Dernier message: 10/05/2007, 20h39
  5. [FTP] fopen et chemin absolue
    Par pimpmyride dans le forum Langage
    Réponses: 3
    Dernier message: 03/05/2007, 12h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo