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 :

codeblocks (en C sous windows 8) _wstat _wstat64


Sujet :

C

  1. #1
    Membre du Club

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 69
    Points : 67
    Points
    67
    Billets dans le blog
    1
    Par défaut codeblocks (en C sous windows 8) _wstat _wstat64
    Bonjour,

    J'essaye de lire la taille d'un fichier mais la fonction _wstat (ou_wstat64) m'indique l'erreur "No such file or directory" alors que le fichier est bien présent (d'ailleurs la fonction fopen marche bien sur ce même fichier).
    Est-ce que vous auriez une suggestion s'il vous plait?

    Merci
    Mich

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    montre un peu ton code qui montre que _wstat ne fonctionne pas mais fopen si.
    Sinon, c'est surement un coup des papillons...
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre du Club

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 69
    Points : 67
    Points
    67
    Billets dans le blog
    1
    Par défaut
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    #include <Wchar.h>
     
        int res;
        struct _stat64 filestat;
        extern int errno;
        u8 NameTab[] = "D:\\Temp\\test\\montest.DAT";
     
        res = _wstat64((const wchar_t *)NameTab, &filestat);
        if (res==-1)
            printf("errno %d\r\n", errno);
        else
            printf("st_size %d\r\n", (int)filestat.st_size);
     
     
        fid = fopen((const char *)NameTab, "rb");
        if (fid == NULL)
        {
            printf("erreur chemin fichier IN\r\n");
            return 0;
        }

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Effectivement avec ce code y avait des chances que ça marche pas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    u8 NameTab[] = "D:\\Temp\\test\\montest.DAT";
     
    res = _wstat64((const wchar_t *)NameTab, &filestat);
    Tu passes un pointeur vers une chaîne de caractères sur 8 bits, à une fonction qui s'attend à recevoir une chaine de caractères "larges" (ce qui, sous Windows, signifie 16 bits).
    La fonction _wstat64 va donc recevoir une chaîne de où chaque paire de caractères est concaténée en un seul (par exemple le "D:" sera interprété comme un seul caractère large constitué des codes ASCII de la lettre D et du deux points concaténés).
    Ce qui est comique, c'est que normalement le compilateur doit t'engueuler (te dire un truc du style "Heu ... tu passes un pointeur sur char à une fonction qui attend un pointeur sur wchar_t ... Tu dois te tromper quelque part !") mais tu as inséré un cast pour ne pas voir cette erreur (ce qui rappelle une citation de Raymond Chen que quelqu'un ici a en signature).
    Faire un cast signifie "Oui compilateur, je sais que ça parait bizarre, mais t'inquiète pas, je sais très bien ce que je fais". Et ensuite tu es étonné que ça ne marche pas ?

    La solution, c'est soit d'utiliser une vraie chaîne de caractères larges, soit d'utiliser _stat64() plutôt que _wstat64().

  5. #5
    Membre du Club

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 69
    Points : 67
    Points
    67
    Billets dans le blog
    1
    Par défaut
    le probleme est que sous codeblocks j'ai bien un fichier Stat.h mais il est sous \codeblocks\mingw\include\sys\ et non pas sous \codeblocks\mingw\include\ comme le fichier Wchar.h donc codeblocks ne le trouve pas. Je ne sais pas a quoi sert ce repertoire sys d'autant plus que certains fichiers (time.h par exemple) sont presents dans les 2 repertoires mais les 2 fichiers ne sont pas identiques ...
    Est-ce qu'il y a une fonction connue pour transformer une chaine de caractere en une chaine de caractere large?

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Alors :
    - d'apres ce que je vois ici :
    http://msdn.microsoft.com/en-us/library/14h5k7ff.aspx
    tu dois inclure <sys/types.h> et ensuite <sys/stat.h> pour pouvoir accéder à stat64(). Donc c'est NORMAL que ton stat.h se trouve dans un répertoire sys.

    Est-ce qu'il y a une fonction connue pour transformer une chaine de caractere en une chaine de caractere large?
    - La première qui me vient à l'esprit c'est MultiByteToWideChar() http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx mais je serais pas étonné qu'il existe plus simple.

  7. #7
    Membre du Club

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 69
    Points : 67
    Points
    67
    Billets dans le blog
    1
    Par défaut
    merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. codeblocks (en C sous windows) mktime
    Par mich35 dans le forum Débuter
    Réponses: 2
    Dernier message: 07/08/2014, 09h06
  2. codeblocks (en C sous windows) gestion du temps
    Par mich35 dans le forum Débuter
    Réponses: 2
    Dernier message: 04/08/2014, 19h03
  3. Configurer Codeblocks pour gdk_threads_init sous Windows
    Par acryline dans le forum GTK+ avec C & C++
    Réponses: 0
    Dernier message: 20/08/2010, 11h09
  4. Erreur dans codeblocks pour GTK sous Windows
    Par acryline dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 09/08/2010, 14h27

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