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 :

Stocker une taille


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Par défaut Stocker une taille
    Bonjour,

    La fonction ftell qui permet de stocker l'offset du curseur peut être utilisé pour récupérer la taille d'un fichier. J'aimerai savoir comment peut-on récupérer cette taille si elle est de l'ordre du go? La fonction ftell renvoie elle même un long donc pas assez pour donner l'offset de gros fichier. Je sais qu'il existe la fonction FileAttributesEx des api windows mais j'aimerai le faire de manière portable.

    Ma deuxième question concerne telldir, celle-ci renvoie off_t octets. Mais dans quelle genre de variable stocker ce résultat lorsqu'il dépasse un int ou un long ? (Plusieurs Go)

  2. #2
    Membre éprouvé 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
    Par défaut
    Salut,

    Il a une version 64 bits des fonctions que tu evoques permettant de lire des fichier de plus de 4Go
    - ftello64
    - fopen64
    - fseeko64

    Pour les utiliser sur un systeme 32 bits if faut definir les variables suivantes

    _LARGEFILE64_SOURCE
    __USE_FILE_OFFSET64
    #define _FILE_OFFSET_BITS 64

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Par défaut
    Bonjour,

    Ces fonctions ne sont pas référencés dans le man que ce soit sur linux ou sur le net. Est-ce normal ? Et est-ce qu'elles sont standards pour les systêmes 32bits?

    Ensuite je connaissais le #define _FILE_OFFSET_BITS 64 qui me permettait d'ouvrir de gros fichiers avec fopen. Mais je ne vois pas comment définir les variables dont tu parles. Est-ce que tu peux me donner un exemple ?

    Ensuite, ma question initiale c'était dans quel type de variables stocker le nombre renvoyé par les fonctions quand la taille fait plusieurs go donc, est supérieure à ce que peut stocker un int ?

  4. #4
    Membre éprouvé 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
    Par défaut
    Oui j'avais compris ta demande, mais pour stocker des variable superieur à 2Go il faut déjà etre en mesure de les obtenir. Et les la fonction ftell classique, par example, ne permet pas d'obtenir de telles valeurs. D'ou l'utlisation de fonction étendues au 64bits.
    Maintenant pour stocker des entiers > 2Go tu as plusieurs solutions équivalentes.
    - long long in
    - off64_t

    Pour la directive "#define _FILE_OFFSET_BITS 64", je pense qu"elle seule suffit dailleurs, il suffit de la mettre au debut de ton fichier cpp ou mieux de ton fichier d'include. Elle est nécessaire si tu compiles 32 bits, sinon pas besoin de l'inclure je pense.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Par défaut
    Ah oui je comprends. Cependant je ne trouve aucun prototype de ces fonctions. Sais-tu où je pourrai les trouver ?

    Est-ce qu'elles s'utilisent de la même manière que les versions 32 bits ?
    Car gcc me renvoie :assigment makes pointer from integrer without a cast

    et apparament ça concerne la ligne de mon fopen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier = fopen64("image.iso", "rb");

  6. #6
    Membre éprouvé 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
    Par défaut
    De mémoire je crois qu'il ne faut pas etre en 'ansi strict', parce qu'il n'y a pas de prototype, quelquechose comme ca.
    Sinon tu fais un google sur fopen64 et tu auras des tas d'example.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Par défaut
    Je ne pense pas que cela soit le programme car d'après ce lien : http://cactuscode.org/pipermail/deve...ry/005700.html
    Depuis la version 9, le strict ansi n'est plus défini. Et même quand je modifie les options de compilation j'ai toujours ce warning et j'obtiens un 0 pour la taille. Voici mon code :
    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
    #define _FILE_OFFSET_BITS 64
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
    FILE *fichier = NULL;
    long long int taille = 0;
     
    fichier = fopen64("file.iso", "rb"); // warning: assignment makes pointer from integer without a cast
     
    if (fichier != NULL)
    {
    fseeko64(fichier, 0, SEEK_END);
    taille = ftello64(fichier);
    printf("%lld\n", taille);
    fclose(fichier);
    }
     
    return 0;
    }

  8. #8
    Membre éprouvé 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
    Par défaut
    Bon j'ai essayé ton code sans changer une virgure, à part le nom du fichier et pas de souci pour moi, il fonctionne sur un code 32bits sur un fichier > 4Go.
    Je l'ai également testé sous linux, ton systéme visiblement, et là aussi ca fonctionne.
    J'utilise gcc4.5 peut-etre est-ce ton compilo le probléme.

  9. #9
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    warning: assignment makes pointer from integer without a cast
    semble indiquer que le prototype de fopen64() n'a pas été trouvé.

    Pour information :

    12.3 Opening Streams
    ....
    — Function: FILE * fopen64 (const char *filename, const char *opentype)

    This function is similar to fopen but the stream it returns a pointer for is opened using open64. Therefore this stream can be used even on files larger then 2^31 bytes on 32 bit machines.

    Please note that the return type is still FILE *. There is no special FILE type for the LFS interface.

    If the sources are compiled with _FILE_OFFSET_BITS == 64 on a 32 bits machine this function is available under the name fopen and so transparently replaces the old interface

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Par défaut
    Merci pour la référence, en fait ftello64, fopen64, fseeko64 restent fopen, ftello et fseeko avec le #define FILE_OFFSET_BITS 64

    Mon code marche, je parviens à récupérer les tailles de gros fichiers. Merci de votre aide

  11. #11
    Membre éprouvé 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
    Par défaut
    Super, mais pourquoi donc l'example que tu nous a fournit ne fonctionnait pas, alors?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Par défaut
    Ce qui est déjà sur c'est que lorqu'on utilise le define, il faut remplacer ces fonctions par fopen, ftello et fseeko comme l'indique la référence donnée par diogene.
    Ensuite j'ai essayé de les utiliser sans la constante, mais elles marchent pas. Toujours le même warning. Peut être que ces fonctions ont été elevées ? Mais je ne comprends pas comment elles marchent chez toi...
    J'ai installé gcc récemment donc je pense pas que ce soit un problème de version. Peut-être les options du compilo ?

  13. #13
    Membre éprouvé 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
    Par défaut
    C'est effectivement étrange, d'autant plus que je fais ca sous Windows, plusieurs linux et même MacOS avec des versions de gcc différentes donc.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Par défaut
    J'ai testé sous windows avec la dernière version de code::blocks qui utilise gcc et là c'est l'inverse. Déjà, il ne connait les fonction ftello et fseeko et je dois utiliser ftello64 et fseeko64 à la place. Par contre pas de problème entre fopen et fopen64 les 2 marchent.

  15. #15
    Membre éprouvé 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
    Par défaut
    Ok comme moi donc. J'utilise aussi code::block dans tous mes OS, mais je ne pense pas que l'EDI change quelquechose à l'affaire

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

Discussions similaires

  1. Stocker une chaîne de taille réduite
    Par rambc dans le forum Général Python
    Réponses: 3
    Dernier message: 09/06/2009, 22h01
  2. [Socket][Byte] Probleme d'envoi d'une taille de fichier
    Par Erok dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 12/05/2009, 17h38
  3. [MySQL] Quel est le meilleur moyen de stocker une date/heure ?
    Par MiJack dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 31/07/2004, 12h19
  4. [JTextFiled]Mettre une taille max à la saisie
    Par mush_H dans le forum Composants
    Réponses: 13
    Dernier message: 29/07/2004, 11h22
  5. Imposer une taille à un composant en conception
    Par teryen dans le forum Composants VCL
    Réponses: 14
    Dernier message: 28/06/2004, 15h06

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