Page 1 sur 1

Juste une question ce bout de code svp....

Publié : mer. 29/avr./2009 9:37
par jbernard13
Bonjour, j'ai une petite question :
voilà je voudrais que mes 2 champs sois enregistrer dans un fichier ligne par ligne , pour se faire j'ai écris 2 fois la commande WriteStringN et cela marche , mais j'en suis sur qu'il y a une astuce en mettant une seule commande WriteStringN et un saut de ligne mais là je me rappelle plus .

Code : Tout sélectionner

*** Test de sauvegarde***


;***Constante de la fenetre et des gadgets***
Enumeration
  #Fenetre_0
  #String_1
  #String_2
  #Bouton_sauver
  #Fichier
EndEnumeration

;*** Procedure ***
Procedure sauver()
  CreateFile(#Fichier,"Data")
  Champ1$=GetGadgetText(#String_1)
  Champ2$=GetGadgetText(#String_2)
  WriteStringN(#Fichier,Champ1$)
  WriteStringN(#Fichier,Champ2$)
  MessageRequester("Infos","Les champs sont  sauvegarder",#MB_OK)
  CloseFile(#Fichier)
EndProcedure

;*** Creation de la fenetre et des gadgets ***
If OpenWindow(#Fenetre_0,0,0,300,120,"Fenetre de test",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
  StringGadget(#String_1,10,20,200,20,"")
  StringGadget(#String_2,10,50,200,20,"")
  ButtonGadget(#Bouton_sauver,20,90,100,20,"Sauver")
EndIf


;*** Boucle du programme ***
Repeat  
  Select WaitWindowEvent()
    Case #PB_Event_Gadget ;** Gestion des gadgets 
      Select EventGadget()
        Case #Bouton_sauver : sauver()
          
      EndSelect
    Case #PB_Event_CloseWindow;** Gestion de la fermeture de la fenetre 
       Quitter = #True  
    EndSelect
    Until Quitter
   End 
  

Publié : mer. 29/avr./2009 10:00
par gnozal

Code : Tout sélectionner

  WriteString(#Fichier,Champ1$)  ; 1er champ [sans retour à la ligne]
  WriteString(#Fichier,",")      ; séparateur [sans retour à la ligne]
  WriteStringN(#Fichier,Champ2$) ; 2e champ [avec retour à la ligne]

Publié : mer. 29/avr./2009 10:11
par jbernard13
Merci Gnozal
donc si je mets 2 fois WriteStringN c'est pas bon alors ?

Publié : mer. 29/avr./2009 10:16
par gnozal
jbernard13 a écrit :Merci Gnozal
donc si je mets 2 fois WriteStringN c'est pas bon alors ?
Ben non, pas si tu veux les données sur une même ligne.
Purebasic.chm a écrit :WriteString(#File, Text$ [, Flags])   : write a string in the #File.
WriteStringN(#File, Text$ [, Flags]) : write a string in the #File and add the 'end of line' character

Publié : mer. 29/avr./2009 12:01
par cederavic
Je crois que ce qu'il veux c'est enregistrer ces deux champs sur 2 lignes mais avec une seulle commande : WriteString(#Fichier, Champ1$ + chr(13) + chr(10) + Champ2$)

Publié : mer. 29/avr./2009 12:33
par gnozal
cederavic a écrit :Je crois que ce qu'il veux c'est enregistrer ces deux champs sur 2 lignes mais avec une seulle commande : WriteString(#Fichier, Champ1$ + chr(13) + chr(10) + Champ2$)
Ah bon, pt'êt ben ...
Il faut ajouter un CrLf à la fin alors :

Code : Tout sélectionner

WriteString(#Fichier, Champ1$ + #CrLf$ + Champ2$ + #CrLf$)

Publié : mer. 29/avr./2009 12:41
par case
cederavic a écrit :Je crois que ce qu'il veux c'est enregistrer ces deux champs sur 2 lignes mais avec une seulle commande : WriteString(#Fichier, Champ1$ + chr(13) + chr(10) + Champ2$)
il vaudrais mieux qu'il utilise tout de même writestringN() sinon la suite vas s'ajouter sur la même ligne il me semble.

WriteStringN(#Fichier, Champ1$ + chr(13) + chr(10) + Champ2$)

ou bien il faut ajouter les caracteres de fin de ligne aussi a la fin de champ2$


WriteString(#Fichier, Champ1$ + chr(13) + chr(10) + Champ2$+ chr(13) + chr(10) )

alors ce post me fais me poser une question d'optimisation.

écrire plusieurs ligne en une seule ligne réduit le nombre d'accès disque.

donc peut être que dans un souci d'optimisation il vaudrais mieux concaténer les chaines a écrire dans un tampon en mémoire et écrire celui ci quand il est plein au lieu de faire des accès disque pour écrire chaque ligne ?

bien sur le souci c'est qu'en cas de fin inopinée du programme on perd les données non encore enregistrées

et le temps gagné en accès disque est-il plus grand que celui perdu en remplissant le buffer...

je vais essayer de tester ca :)

Publié : mer. 29/avr./2009 13:33
par jbernard13
merci case

j'ai fait comme tu as dis jai rejouter la lecture du fichier malheureusement seule la premiere est prise en compte pas la deuxieme
en faites au chargement il ecris dans les 2 champs la meme ligne..

Code : Tout sélectionner

*** Test de sauvegarde***


;***Constante de la fenetre et des gadgets***
Enumeration
  #Fenetre_0
  #String_1
  #String_2
  #Bouton_sauver
  #Fichier
EndEnumeration

;*** Procedure ***
Procedure sauver()
  CreateFile(#Fichier,"Data")
  Champ1$=GetGadgetText(#String_1)
  Champ2$=GetGadgetText(#String_2)
  ;WriteString(#Fichier,Champ1$)
 ;WriteString(#Fichier,",")
  ;WriteStringN(#Fichier,Champ2$)
  WriteStringN(#Fichier, Champ1$ + Chr(13) + Chr(10) + Champ2$) 
  MessageRequester("Infos","Les champs sont  sauvegarder",#MB_OK)
  CloseFile(#Fichier)
EndProcedure
Procedure charger()
  OpenFile(#Fichier,"Data")
  ReadFile(#Fichier,"Data")
  Lire$=ReadString(#Fichier)
  SetGadgetText(#String_1,Lire$)
  SetGadgetText(#String_2,Lire$)
  CloseFile(#Fichier)
  
  
 
EndProcedure
;*** Creation de la fenetre et des gadgets ***
If OpenWindow(#Fenetre_0,0,0,300,120,"Fenetre de test",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
  StringGadget(#String_1,10,20,200,20,"")
  StringGadget(#String_2,10,50,200,20,"")
  ButtonGadget(#Bouton_sauver,20,90,100,20,"Sauver")
EndIf
charger()

;*** Boucle du programme ***
Repeat  
  Select WaitWindowEvent()
    Case #PB_Event_Gadget ;** Gestion des gadgets 
      Select EventGadget()
        Case #Bouton_sauver : sauver()
          
      EndSelect
    Case #PB_Event_CloseWindow;** Gestion de la fermeture de la fenetre 
       Quitter = #True  
    EndSelect
    Until Quitter
   End 
  

Publié : mer. 29/avr./2009 13:51
par gnozal

Code : Tout sélectionner

  ; OpenFile(#Fichier,"Data") 
  ReadFile(#Fichier,"Data")
  Lire$=ReadString(#Fichier)  ; <-- lire 1er champ
  SetGadgetText(#String_1,Lire$) 
  Lire$=ReadString(#Fichier)  ; <-- lire 2e champ
  SetGadgetText(#String_2,Lire$)

Publié : mer. 29/avr./2009 14:21
par jbernard13
Merci Gnozal