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 :

Fichier binaire supérieur à 2GB


Sujet :

C++

  1. #1
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut Fichier binaire supérieur à 2GB
    Bonjour,

    J'utilise actuellement les library "stdio.h" , fseek, fopen... pour gerer un fichier binaire sous winxp64. Malheureusement, mon fichier fait parfois plus de 2GB et alors toutes ces fonctions plante lamentablement.

    Comment faire, ou quelle library utiliser pour ecrire et lire des fichier > 2 GB

    merci d'avance

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    L'API système (Platform SDK) directement.... ou alors sous MSVC++ la stdlib propose des versions "correctes" des fonctions de file-management (avec notamment des unsigned __int64 pour les tailles) si je me souviens bien.
    Comme d'ailleurs pour la plupart des fonctions (gestion des chaines, ...).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Ok, mais moi je voudrais quelque chose de portable, du C++

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Vu le message originel, il était pas évident que ce soit pour être portable (winxp64), ni forcément C++ (stdlib).

    Tu trouveras alors peut-être ton bonheur dans 'boost'.

    La stdlib est si vieille (si sure , et si souvent mise à jour ) que c'est plus une plaie à utiliser qu'autre chose. Mais c'est un avis que je partage avec moi-même
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Sous Win64, les size_t sont supposés faire 64 bits, après il faut s'assurer que les fonctions d'accès aux fichiers suivent.
    Si ça ne suit pas, tu sera réduit à utiliser l'API système...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    La stdlib est si vieille (si sure , et si souvent mise à jour ) que c'est plus une plaie à utiliser qu'autre chose. Mais c'est un avis que je partage avec moi-même
    Tu parles de quoi là ?
    Boost ftw

  7. #7
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par loufoque
    Tu parles de quoi là ?
    De stdio.h et consorts

    Citation Envoyé par Médinoc
    Sous Win64, les size_t sont supposés faire 64 bits, après il faut s'assurer que les fonctions d'accès aux fichiers suivent.
    Oui sous Windows 64, compilé pour x64. Les fonctions devraient marcher.
    Dès qu'on compile pour x32... size_t revient à 32 bits ... et du coup, même sous Windows x32 ca ne marche pas (parcequ'on peut quand même avoir des fichiers de quelques centaines de Go sous Windows x32 ! ).

    Pour la gestion mémoire size_t est très bien... pour les fichiers, offset et tailles devraient être des int64 (ou equivalents), jusqu'à ce que les disques de 16 exa-octets (16777216 To) fassent leur apparition.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    De la bibliothèque standard C tu veux dire ? En général ou dans le cas de son implémentation dans VC++ ?
    Boost ftw

  9. #9
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par uriotcea
    Bonjour,

    J'utilise actuellement les library "stdio.h" , fseek, fopen... pour gerer un fichier binaire sous winxp64. Malheureusement, mon fichier fait parfois plus de 2GB et alors toutes ces fonctions plante lamentablement.

    Comment faire, ou quelle library utiliser pour ecrire et lire des fichier > 2 GB

    merci d'avance
    Il faut impérativement utiliser des API systemes comme le dit Nicroman.
    Jouer sur la pagination de la mémoire.
    Oublies carrément la portabilité , la gestion mémoire c'est bcp trop spécifique à l'OS.
    Si tu veux faire qque chose de portable tu ne peux pas optimiser...
    je ne sais pas ce que c'est que cette mode de vouloir faire portable à tout prix.

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    N'importe quoi Mat.M.

    La seule chose qui empêche ici de manipuler les fichiers de plus de 2 Gio avec la bibliothèque standard c'est qu'elle n'est pas implémentée correctement.

    Il n'y aucunement besoin de passer par des éléments spécifiques au système d'exploitation.
    Je sais pas ce que c'est que cette mode de se rajouter des dépendances et de se limiter à des systèmes spécifiques quand on peut travailler avec une abstraction portable...

    Si tu veux faire qque chose de portable tu ne peux pas optimiser...
    Il faudrait pas exagérer non plus.
    Boost ftw

  11. #11
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par loufoque
    N'importe quoi Mat.M.

    La seule chose qui empêche ici de manipuler les fichiers de plus de 2 Gio avec la bibliothèque standard c'est qu'elle n'est pas implémentée correctement.

    Il n'y aucunement besoin de passer par des éléments spécifiques au système d'exploitation.
    Je sais pas ce que c'est que cette mode de se rajouter des dépendances et de se limiter à des systèmes spécifiques quand on peut travailler avec une abstraction portable...


    Il faudrait pas exagérer non plus.
    d'accord alors il fait ce qu'il veut s'il a raison et on en reparle quelques temps après...puisque je raconte n'importe quoi ..
    je ne parle pas de rajouter des dépendances ou quoique ce soit simplement avec les fonctionnalités "standards" cela ne peut fonctionner dans certains cas...
    Uriotcea si tu programmes sous Windows je te conseille vivement de consulter le MSDN mieux si tu le trouves le livre de Jeffrey Richter "Inside Win Nt" je crois qui parle de la gestion de la mémoire,threads et fichiers.
    Enfin tu fais ce que tu veux vu que je dis n'importe quoi...
    après tout si ton projet pédale ce ne sera pas de ma faute.. et qu'il y a des gens qui ne jurent que par la portabilité

  12. #12
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Entre l'un et l'autre il y a un juste milieu... et la gestion des fichiers est le truc implémenté en premier par les librairies de portabilité comme boost. Un peu comme la gestion des chaînes de caractères (oui std::string c'est très bien) et des charsets, des threads, de la mémoire, et de plein d'autres choses tellement spécifique à l'OS, qu'il n'y a aucune spécification C, ou C++.

    Des langages plus récents comme Java, et C# intègrent parfaitement ces éléments.

    La libraire C standard est ce qu'elle est, et certaines fonctions (simplement par leur déclaration) ont du mal sur les machines récentes...comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long int ftell ( FILE * stream );
    C'est d'ailleurs, si mes souvenirs sont bon, la seule fonction de stdio qu'on ne puisse pas vraiment utiliser. Mais c'est quand même rare quand on en a besoin.

    Si tu nous disais exactement ce qui foire, on pourrait peut-être dire comment faire...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  13. #13
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Ok OK, la seule chose que je demande c'est comment me déplacer dans un fichier de plus de 2GO. Autrement dire qui remplace fseek(...). qui n'accepte que des entrées limitées à 32Bits

  14. #14
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    fseek(...). qui n'accepte que des entrées limitées à 32Bits
    Et t'as lu ça où ?
    TON implémentation de fseek n'accepte que des entrées limitées à 32 bits. Le standard ne dicte rien de tel, et il est techniquement tout à fait possible techniquement d'étendre cela à la taille qu'on veut.
    Boost ftw

  15. #15
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par loufoque
    Et t'as lu ça où ?
    TON implémentation de fseek n'accepte que des entrées limitées à 32 bits. Le standard ne dicte rien de tel, et il est techniquement tout à fait possible techniquement d'étendre cela à la taille qu'on veut.
    J'ai du mal à voir comment utiliser autre chose qu'un long et rester conforme. Et ce à que réfère long est plus difficile à changer.

    L'interface C++ est plus souple.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En effet...

    La version bas-niveau POSIX, elle, prend un off_t en paramètre, ce qui la rend assez flexible, mais on dirait bien qu'en C, la taille d'un fichier soit limitée à la valeur maximale d'un long...

    À moins bien sûr, de renoncer à l'accès aléatoire, ou peut-être de faire plusieurs fseek() à la suite.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Loufoque, la commande fseek(..) attendant un long comme argument, essayer d'y mettre un un "long long" revient à y mettre un nombre négatif !!!!!
    Je l'ai lu null part, j'ai just essayé, mais de toute maniere c'est évident

  18. #18
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    La taille d'un long n'est pas dictée par le standard.

    De toutes manières, l'interface standard C++ ne fixe pas le type. Donc les problèmes éventuels liées au typage fixé de la bibliothèque standard C sont relativement peu importants.
    Boost ftw

  19. #19
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Je veux bien croire tout ce que tu veux. Ecrit moi le bout de code permettant de se possitionner à la position 3 GO sur un fichier de 4 GO. Je suis preneur.

  20. #20
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par loufoque
    La taille d'un long n'est pas dictée par le standard.
    Et? Implementer un langage, ce n'est pas un jeu formel mais pragmatique. Le choix de la taille d'un long va dependre d'un tas de choses, et le fait que le systeme en question soit capable de gerer des fichiers de plus de 2Gb est un critere qui doit se retrouver tout en bas de la liste.

    De toutes manières, l'interface standard C++ ne fixe pas le type. Donc les problèmes éventuels liées au typage fixé de la bibliothèque standard C sont relativement peu importants.
    Qu'ai-je ecrit d'autre?
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. Upload fichier supérieur à 2Gb
    Par LostRailler dans le forum Langage
    Réponses: 6
    Dernier message: 20/11/2009, 19h48
  2. fichier binaire > 2GB
    Par uriotcea dans le forum C
    Réponses: 0
    Dernier message: 17/03/2009, 18h48
  3. [Debutant] Comment lire la taille d'un fichier binaire ?
    Par Invité dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 18/12/2003, 19h20
  4. communication fichier binaire fichier txt
    Par micdie dans le forum C
    Réponses: 3
    Dernier message: 05/12/2002, 00h19
  5. fichier binaire ou texte
    Par soussou dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/06/2002, 13h39

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