V4xx :Problème Lecture ecriture dans un fichier !

Archive.
Stefou
Messages : 234
Inscription : jeu. 18/janv./2007 14:08

V4xx :Problème Lecture ecriture dans un fichier !

Message par Stefou »

Je n'ai pas suivi les dernier bug, peut être as t-il été déjà répertorié...
Je comprend d'où vient des bug dans mes programmes !
Lorsque l'on lit dans un fichier, il y a des bugs de position

Je viens de tester le code suivant qui pour moi ne fonctionne pas correctement avec la V4xx, j'ai du remonter à la V3.94 pour que cela fonctionne correctement !

Merci d'avance de corriger cela au plus vite et bon courage


Code : Tout sélectionner

For j=1 To 2 ;creation de 2 fichiers textes
     If CreateFile(38,"c:\test"+Str(j)+".txt")
          For i=1 To 10
               WriteStringN(38,LSet(Str(i),3,"0"))
          Next
          CloseFile(38)
     EndIf
Next
If OpenFile(38,"c:\test1.txt") ;premier ecriture dans le fichier : 
     ;ecriture à la fin du fichier !!!! au lieu de la troisième ligne
     ReadString(38) 
     ReadString(38) 
     WriteString(38,"ici")
     CloseFile(38)
EndIf

If OpenFile(38,"c:\test2.txt") ; deuxième essaie en repositionnant ,
     ;mais la valeur de la taille du fichier change !!!
     Debug Lof(38)
     ReadString(38) 
     ReadString(38) 
     FileSeek(38,Loc(38))
     WriteString(38,"ici")
     Debug Lof(38)
     CloseFile(38)
EndIf
If ReadFile(38,"c:\test2.txt")
     Debug Lof(38)
     CloseFile(38)
EndIf
Avec la V3.94

Code : Tout sélectionner

For j=1 To 2 ;creation de 2 fichiers textes
    If CreateFile(38,"c:\test"+Str(j)+".txt")
        For i=1 To 10
            WriteStringN(Str(i))
        Next
        CloseFile(38)
    EndIf
Next
If OpenFile(38,"c:\test1.txt") ;premier ecriture dans le fichier : 
    ;ecriture à la fin du fichier !!!! au lieu de la troisième ligne
    ReadString() 
    ReadString() 
    WriteString("i")
    CloseFile(38)
EndIf

If OpenFile(38,"c:\test2.txt") ; deuxième essaie en repositionnant ,
    ;mais la valeur de la taille du fichier change !!!
    Debug Lof()
    ReadString() 
    ReadString() 
    FileSeek(Loc())
    WriteString("i")
    Debug Lof()
    CloseFile(38)
EndIf
If ReadFile(38,"c:\test2.txt")
    Debug Lof()
    CloseFile(38)
EndIf
Dernière modification par Stefou le mer. 21/nov./2007 18:48, modifié 1 fois.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Stefou a écrit :V4xx :AïE CA craint !!!
Ah les annonces dramatiques ...
Stefou a écrit :Je n'ai pas suivi les dernier bug, peut être as t-il été déjà répertorié...
Je comprend d'où vient des bug dans mes programmes !
Lorsque l'on lit dans un fichier, il y a des bugs de position
Depuis la V4, le système de fichiers utilise un tampon : c'est (beaucoup) plus rapide mais si on veut lire et écrire en même temps dans le même fichier il faut faire attention.
Stefou a écrit :Merci d'avance de corriger cela au plus vite et bon courage
Merci d'avance de lire le manuel au plus vite et bon courage :twisted:
Vas voir la fonction FlushFileBuffers() dans l'aide ; elle permet de s'assurer que les infos sont vraiment écrites sur le disque.
La fonction FileBuffersSize() permet de définir la taille du tampon, voir même de le supprimer.

Code : Tout sélectionner

For j=1 To 2 ;creation de 2 fichiers textes 
  If CreateFile(38,"c:\test"+Str(j)+".txt") 
    For i=1 To 10 
      WriteStringN(38,LSet(Str(i),3,"0")) 
    Next 
    CloseFile(38) 
  EndIf 
Next 
If OpenFile(38,"c:\test1.txt") ;premier ecriture dans le fichier : 
  FileBuffersSize(38, 0)
  ;ecriture à la fin du fichier !!!! au lieu de la troisième ligne 
  ReadString(38) 
  ReadString(38) 
  WriteString(38,"ici") 
  CloseFile(38) 
EndIf 
; 
If OpenFile(38,"c:\test2.txt") ; deuxième essaie en repositionnant , 
  ;mais la valeur de la taille du fichier change !!! 
  Debug Lof(38) 
  ReadString(38) 
  ReadString(38) 
  FileSeek(38,Loc(38)) 
  WriteString(38,"ici") 
  FlushFileBuffers(38)
  Debug Lof(38) 
  CloseFile(38) 
EndIf 
If ReadFile(38,"c:\test2.txt") 
  Debug Lof(38) 
  CloseFile(38) 
EndIf
Stefou
Messages : 234
Inscription : jeu. 18/janv./2007 14:08

Message par Stefou »

Salut Gnozal,

Désolé pour le titre du post, ce problème est désagreable pour moi, mais n'est effectivement pas dramatique à l'échelle de purebasic.

Je ne trouve pas normale que :
- Lof() ne me renvoie pas la taille exacte du fichier
- lorsque que j'écris un mot dans un fichier apres deux readstring(), le mot ne soit pas plaçer à la troisème ligne
- j'ai a des moments la valeur de loc() plus élèvée que la valeur de Lof()


merci de prendre le temps de m'expliquer

a+ et mille merci pour JaPBe
Stefou
Messages : 234
Inscription : jeu. 18/janv./2007 14:08

Message par Stefou »

???? Pour vous il n'y a pas de problème ???? Ou vous faites la tête ? 8O
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

chez moi lof est juste.
Petite précision: Lof renvoie la taille en octet du fichier et non pas la taille occupée sur le disque.

Le reste j'ai la fleme de vérifier, mais je pense que, comme pour le cas de lof() c'est toi qui te trompes: j'ai plusieurs applications qui triffouillent dans les fichiers, toutes on été recompilées en PB V4.10 finale et je n'ai aucun bug.
Lna
Messages : 181
Inscription : mar. 21/juin/2005 11:11

Message par Lna »

Je pense qu'il y a un problème de mémorisation. 8O
Dès qu'on utilise la lecture, sans fileseek toute écriture est pointée automatiquement à la fin du fichier.

Code : Tout sélectionner

If CreateFile(38,"c:\test1.txt") 

  For i=1 To 5
    WriteStringN(38,Str(i))
  Next i
  
  CloseFile(38)
  
EndIf

Debug "Debut lecture fichier"
If ReadFile(38,"c:\test1.txt")

  While Eof(38)=0
  
    Debug ReadString(38) 
    
  Wend
  
  CloseFile(38)
EndIf 
Debug "Fin lecture fichier"

If OpenFile(38,"c:\test1.txt")

  FileSeek(38,0)
  WriteStringN(38,"a") ; remplace le 1
  FlushFileBuffers(38)
  
  Debug ReadString(38) ; 2
  Debug ReadString(38) ; 3
  
  WriteStringN(38,"b") ; Ecriture à la fin à la suite de ReadString
  
  ; FlushFileBuffers(38) ; avec ou sans idem
  
  CloseFile(38)
EndIf 
Debug "Debut lecture fichier"
If ReadFile(38,"c:\test1.txt")

  While Eof(38)=0
  
    Debug ReadString(38) 
    
  Wend
  
  CloseFile(38)
EndIf 
Debug "Fin lecture fichier"

Code : Tout sélectionner

Debut lecture fichier
1
2
3
4
5
Fin lecture fichier
2
3
Debut lecture fichier
a
2
3
4
5
b
Fin lecture fichier
Après confirmation, si quelqu'un veut contacter Houston comme dans la tradition. :idea:

@ peluche
Stefou
Messages : 234
Inscription : jeu. 18/janv./2007 14:08

Message par Stefou »

Merci Lna
Lna
Messages : 181
Inscription : mar. 21/juin/2005 11:11

Message par Lna »

C'est quand même un dysfonctionnement qui a son importance. 8O

J'ai transmis le problème à Houston :wink: :

http://www.purebasic.fr/english/viewtopic.php?t=29796

@ peluche
Répondre