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 Delphi Discussion :

Seek sur TFileStream (32/64 bits)


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 123
    Points : 63
    Points
    63
    Par défaut Seek sur TFileStream (32/64 bits)
    Bonjour,
    j'utilise un fichier ouvert en TFileStream.
    Ce fichier fait plus de 2147483647 caractères.
    lorsque j'essaye d'atteindre des caractères au dessus de 2147863647,
    j'obtiens une erreur de vérification étendue.

    quand je consulte l'aide, je trouve:

    //-------------------------------------------------------------------------------
    Seek, méthode (TStream)
    Se déplace vers une position spécifiée de la ressource de flux.

    Syntaxe Delphi :

    function Seek(Offset: Longint; Origin: Word): Longint; overload; virtual;
    function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; overload; virtual;
    //-------------------------------------------------------------------------------

    est-il possible de forcer la seconde fonction ?

    j'utilise Delphi7 (32 bits) mais le programme tourne aussi sur Windows7 (64 bits)


    Merci pour votre patience et le temps passé à nous apporter votre aide.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Var
      Adresse   : int64;
      FSourcL   : TFileStream;                                            // Fichier source
    begin
      FSourcL:=TFileStream.Create(Nom_fichier, fmOpenRead);               // ouverture du fichier d'entrée en Stream File
      FSourcL.Seek(Ipl[Adresse, soFromBeginning);                         // positionne le pointeur pour la lecture des données
      // utilisation 
      if assigned (FSourcL) then FSourcL.Free;                            // libération du flux
    end;

  2. #2
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    bizarre cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FSourcL.Seek(Ipl[Adresse, soFromBeginning);
    C'est justement d'elle que va dépendre ton fonctionnement. Il faut que l'endroit ou tu stocke / calcule ta variable Adresse soit en int64, sinon tu va juste stocker un integer dans un int64, ce qui revient pour vulgariser a mettre plein de 0 devant.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Il suffit d'utiliser une valeur de TSeekOrigin : soBeginning, soCurrent, soEnd, le type énuméré va forcer le choix de la forme 64bits

    soFromBeginning est une simple constante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    soFromBeginning: Integer = 0; 
    soFromCurrent: Integer = 1; 
    soFromEnd: Integer = 2;

    Sinon tu as trop simplifié ton code et on a une erreur de syntaxe avec un tableau non fermé et inconnu Ipl[Adresse...

    J'ai aussi fait un Array of Int64 pour lire plusieurs endroits dans un gros fichier, un code qui pourrait te plaire pour indexer un fichier texte devant lu de façon non séquentielle Lire fichier texte large avec ProgressBar - TSLTTextFileReader

    Cela a été conçu sous D7 et remanié en XE2 et comme je pouvais avoir de très très gros fichier, l'index "Array of Int64" dépassait les 512Mo de la machine dont je disposais à l'époque, j'ai choisi de créer un fichier d'index qui était 100fois plus rapide que de laisser jouer le Swap.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 123
    Points : 63
    Points
    63
    Par défaut Seek sur TFIleStream (32/64 bits)
    Bonjour,
    merci pour les réponses.
    effectivement, il y a une erreur dans le code.
    voici le bon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Var
      Adresse   : int64;
      FSourcL   : TFileStream;                                                 // Fichier source
    begin
      FSourcL:=TFileStream.Create(Nom_fichier, fmOpenRead);     // ouverture du fichier d'entrée en Stream File
      FSourcL.Seek(Adresse, soFromBeginning);                         // positionne le pointeur pour la lecture des données
      // utilisation 
      if assigned (FSourcL) then FSourcL.Free;                          // libération du flux
    end;
    j'espère que 'soBeginning' va fonctionner.

    bonne journée et merci encore

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 123
    Points : 63
    Points
    63
    Par défaut Seek sur TFileStream (21/64 bits)
    Bonjour,
    placer 'soBeginning' à la place de SoFromBeginning est la bonne solution.

    merci encore pour votre aide.
    bonne journée

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

Discussions similaires

  1. TFileStream : probleme de seek sur très gros fichiers
    Par simoryl dans le forum Composants VCL
    Réponses: 6
    Dernier message: 21/08/2007, 14h00
  2. Vos avis sur Mandriva 2006 64 bits ?
    Par Arioch dans le forum Mandriva / Mageia
    Réponses: 6
    Dernier message: 11/01/2006, 23h16
  3. Opérations sur plus de 64 bits
    Par lsd dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 20/07/2005, 10h42
  4. Réponses: 1
    Dernier message: 28/03/2005, 12h33
  5. [BPW]Exécution du debugger Windows sur un OS 32 bits
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 28/11/2003, 22h55

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