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

Langage C++ Discussion :

Recuperer la taille d'un fichier > 4Go avec la STL


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 40
    Points : 37
    Points
    37
    Par défaut Recuperer la taille d'un fichier > 4Go avec la STL
    Bonjour,

    Je cherche à récupérer la taille d'un fichier de plus de 2 Go.

    La manière habituelle avec la stl (seekg, tellg) me renvoi une taille negative car le fichier de test est trop grand (~ 5 Go)

    J'ai cherche sur internet, mais je trouve rien de concluant pour mon cas.

    Donc existe-t-il un moyen de le faire simplement, voir de manière complexe tant que je suis pas obligé de lire le fichier en entier pour compter le nombre de caractère lu ?

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Portable ou spécifique à une plateforme ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    De préférence portable, mon programme doit fonctionner sur Windows et Aix.

    Mais si il n'existe aucune solution portable, ben je vais devoir rechercher les solution spécifique ...

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Il existe Boost.Filesystem qui est portable sur ces 2 plateformes je crois. Tu as un tuto sur le site : Boost.FileSystem : le système de fichiers de Boost, par Matthieu Brucher.
    La doc de boost propose aussi en exemple un programme qui récupère la taille d'un fichier. YAPUKA tester

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Tu stockes dans des int (signé, ce qu'il ne faut pas faire) ou dans le type dédié, à savoir std::streamsize/std::istream::pos_type (non signé, donc jamais négatif ....) ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par bacelar Voir le message
    GetFileAttributesEx évite de devoir ouvrir/fermer le fichier :
    http://msdn.microsoft.com/en-us/libr...46(VS.85).aspx


  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    Luc Hermitte : Je stock dans un long long.


    3DArchi : c'est vrai que j'oublie à chaque fois boost. Faut que je regarde sur AIX comment on le rajoute et quelle version est compatible avec mon systeme.

    Et merci pour la doc pour windows

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par falcon74 Voir le message
    Luc Hermitte : Je stock dans un long long.
    C'est à peine mieux que d'utiliser un int.

    Utilise vraiment les types dédiés!
    (marrant ça, sous g++/OSX, sizeof(long long)=8, sizeof(std::istream::pos_type)=136, et il le voit non signé (selon numeric_limits<>), et pourtant initialisé à -1 il affiche -1 contrairement à ce qu'il fait pour unsigned long long -- et chez vous, il dit quoi ?)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    Le long long est quand même un entier signé sur 64bits, donc aucun problème pour stocker un nombre de quelques milliards.

    Sinon sur mon Windows (en 32bits) avec Visual j'ai recherché les types des deux :

    std::streamsize est un typedef de int donc on oublie

    std::istream::pos_type : le sizeof me renvoi 24, mais meme quand je remplace mes long long par ce type, je n'ai pas de différence dans mon résultat.

    Ce qui me semble normal puisque c'est le tellg qui ne me renvoit pas la valeur attendu, et pas mes variables de stockage qui sont trop petite pour la suite de mes calculs.

  11. #11
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    L'affichage est aberrant, OK. Avec tous les compilateurs à ta disposition (i.e. serait-ce un bug d'implémentation de ton compilo et/ou de sa SL) ?
    Le re-positionnement aussi ?

    Sinon, il reste en effet des solutions portables comme boost.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    marrant ça, sous g++/OSX, sizeof(long long)=8, sizeof(std::istream::pos_type)=136, et il le voit non signé (selon numeric_limits<>), et pourtant initialisé à -1 il affiche -1 contrairement à ce qu'il fait pour unsigned long long -- et chez vous, il dit quoi ?
    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
    #include <iostream>
    #include <limits>
    template<typename T> void dump()
    {
       std::cout
          <<"sizeof = "<<sizeof(T)<<" "
          <<"is_signed = "<<std::numeric_limits<T>::is_signed<<" "
          <<" -1 = " << static_cast<T>(-1)
          <<std::endl;
    }
    int main()
    {
       std::cout<<std::boolalpha;
       std::cout<<"long long"<<std::endl;
       dump<long long>();
       std::cout<<"std::istream::pos_type"<<std::endl;
       dump<std::istream::pos_type>();
     
       std::cout<<"unsigned int"<<std::endl;
       dump<unsigned int>();
       return 0;
    }
    Citation Envoyé par Visual Express/Windows XP 32
    long long
    sizeof = 8 is_signed = true -1 = -1
    std::istream::pos_type
    sizeof = 24 is_signed = false -1 = -1
    unsigned int
    sizeof = 4 is_signed = false -1 = 4294967295

    Citation Envoyé par MinGW (4.3.3)/Windows XP 32
    long long
    sizeof = 8 is_signed = true -1 = -1
    std::istream::pos_type
    sizeof = 16 is_signed = false -1 = -1
    unsigned int
    sizeof = 4 is_signed = false -1 = 4294967295

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    En fait, en regardant les sources :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    std::istream::pos_type == char_traits<char>::pos_type  == streampos == fpos<mbstate_t>
    // ailleurs :
     #ifdef _WIN64
    typedef __int64 streamoff;
     
     #else /* _WIN64 */
    typedef long streamoff;
     #endif /* _WIN64 */
    // puis :
      template<typename _StateT>
        class fpos{// [...]
    operator streamoff() const;
    }
    Ce qui fait bien pour : std::cout<< static_cast<std::istream::pos_type>(-1);
    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    push        0FFFFFFFFh 
    lea         ecx,[ebp-18h] 
    call        std::fpos<int>::fpos<int>
    mov         ecx,eax 
    call        std::fpos<int>::operator long
    push        eax  
    mov         ecx,dword ptr [__imp_std::cout] 
    call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<<]

    En minGW, streamoff-> long long et donc c'est un operator long long qui est appelé.

  14. #14
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Va aussi voire cette conversation pour les fonctions à utiliser.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. Recuperer la Taille d'un Fichier
    Par med_ellouze dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 14/08/2007, 12h48
  2. recuperer la taille d'un fichier
    Par opensource dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 13/06/2007, 16h33
  3. recuperer la taille d'un fichier.
    Par N00Bforever dans le forum Delphi
    Réponses: 16
    Dernier message: 08/04/2007, 06h37
  4. [VB6] [Réseau] Récupérer la taille d'un fichier avec inet
    Par pcpunch dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 20/02/2003, 21h38
  5. [VB6] [Fichier] Récupérer sa taille
    Par SpP dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/09/2002, 19h56

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