Lire une ligne spécifique dans un fichier.txt ou .ini

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Dragor
Messages : 4
Inscription : dim. 19/oct./2008 17:36

Lire une ligne spécifique dans un fichier.txt ou .ini

Message par Dragor »

Bonjour à tous.

J'aimerais faire un jeu du pendu pour m'entraîner au PureBasic mais je rencontre un problème (parmi tant d'autres).

Je vais créer un fichier .txt ou .ini contenant un mot par ligne et faire ensuite un Random pour qu'il aille chercher au hasard un mot.

Mais je n'arrive pas à trouver le paramètre qui permet de faire ça. (J'ai déjà eu du mal à trouver le bon Read).

Donc si vous pouviez m'indiquer le chemin, merci. ^^
Et s'il vous plaît, je ne veux pas de code tout près, j'aimerais comprendre moi même.

Merci d'avance.


Ps : Pendant que j'y suis, il y a t il un moyen pour transformer une chaîne de caractère en *** ? Ou alors il faut passer par Len pour prendre le nombre de caractère, puis mettre autant de * que de caractère ?
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Si je peux faire une suggestion, écrit les mots dans un fichier texte et charge les dans un tableau. Ensuite faire une sélection aléatoire dans le tableau.

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Nom du projet : Gestion d'un tableau de mots
; Fichier : Source principal
; Version : 0.0.0
; Programmation : À compléter
; Programmé par : Guimauve
; Date : 19-10-2008
; Mise à jour : 19-10-2008
; Codé avec PureBasic V4.10
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Dim Mots.s(5)

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Initialisation des mots

Mots(0) = "Patate"
Mots(1) = "Poils"
Mots(2) = "orteille"
Mots(3) = "Cuisse"
Mots(4) = "Patte"
Mots(5) = "Tomate"

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Création du fichier txt

If CreateFile(0, "Mots.txt")
  
  For Index = 0 To 5
    WriteStringN(0, Mots(Index))  
  Next
  
  CloseFile(0)
EndIf

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Lecture des mots depuis le fichier txt

; On utilise une liste car on ne sait pas le nombre
; de mot que le fichier texte contient.

NewList Mots2.s() 

If ReadFile(1, "Mots.txt")
  
  While Eof(1) = #Null
    AddElement(Mots2())
    Mots2() = ReadString(1)  
  Wend 
  
  CloseFile(1)
EndIf

; On demande le nombre de mot que la liste contient
Max.l = ListSize(Mots2()) - 1
 
; La boucle ici c'est pour la démonstration

For loop = 0 To 15
  
  IndexA.l = Random(Max) ; On sélection un numéro aléatoire entre 0 et Max
  Debug IndexA
  SelectElement(Mots2(), IndexA)
  Debug Mots2()
  Debug ""
  
Next

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
Si tu as besoin d'aide, n'hésite pas.

A+
Guimauve
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Salut,
pour ton soucis de remplacement, intéresse toi à la la fonction ReplaceString() de la doc, les exemples sont claires.

Si tu galères, reviens nous voir. :wink:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
venom
Messages : 3138
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Message par venom »

bonjour,
moi je ferai sa avec la fonction preferences()

dico : telecharger ici

Code : Tout sélectionner

;- Window Constants
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
Enumeration
  #Button_0
  #String_0
EndEnumeration

  If OpenWindow(#Window_0, 0, 0, 220, 70, "",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered| #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(#Button_0, 10, 10, 200, 25, "lancer un texte au hasard")
      StringGadget(#String_0, 10, 40, 200, 20, "")

    EndIf
  EndIf

  Repeat
   EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget 
      Select EventGadget()
      
       Case #Button_0
        OpenPreferences("dico.txt"); on ouvre le fichier texte
         Result$ = ReadPreferenceString(Str(Random(20)), ""); la on donne le numero de la ligne et random(20) prend un nombre entre 0 et 20
          SetGadgetText(#String_0, Result$); et la on renvoie Result$ dans un stringgadget()
          
      EndSelect
    EndIf
  Until EventID = #PB_Event_CloseWindow


@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Avec la Drooy's lib qui est devenue pour moi indispensable c'est super facile

Code : Tout sélectionner

IniWrite("c:\test.ini","section1","Key1Section1","data_Key1Section1")
IniWrite("c:\test.ini","section1","Key2Section1","data_Key2Section1")
IniWrite("c:\test.ini","section2","Key1Section2","data_Key1Section2")


IniRead("c:\test.ini","section1","Key1Section1")
IniRead("c:\test.ini","section1","Key2Section1")
IniRead("c:\test.ini","section2","Key1Section2")
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

+1 brossden, même si les commandes de PB 4.20 Read/Writepreference() rendent un peu obsolète ces fonctions de la droopy lib

Code : Tout sélectionner

If CreatePreferences("Preferences.prefs")
  PreferenceGroup("Global")
    WritePreferenceString("ApplicationName", "MP3 Player")
    WritePreferenceString("Version", "1.1b")

  PreferenceComment(" This is the Window dimension")
  PreferenceComment("")

  PreferenceGroup("Window")
    WritePreferenceLong ("WindowX", 123)
    WritePreferenceLong ("WindowY", 124)
    WritePreferenceFloat("WindowZ", -125.5)

  ClosePreferences()
EndIf


OpenPreferences("Preferences.prefs")

  PreferenceGroup("Window")
    Debug ReadPreferenceLong ("WindowX", 0)
    Debug ReadPreferenceLong ("WindowY", 0)
    Debug ReadPreferenceFloat("WindowZ", 0)
    
  PreferenceGroup("Global")
    Debug ReadPreferenceString("ApplicationName", "")
    Debug ReadPreferenceString("Version", "")
    
ClosePreferences()
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Je préfère le code droopy qui est très intuitif et sur une seule ligne !
Denis

Bonne Jounée à tous
Dragor
Messages : 4
Inscription : dim. 19/oct./2008 17:36

Message par Dragor »

Merci pour votre aide mais je suis un peu perdu tellement il y en a... ^^

Mon code c'est ça pour l'instant :

Code : Tout sélectionner

OpenConsole()
EnableGraphicalConsole(1)
ConsoleTitle("Le jeu du Pendu !")

Resultat = ReadFile(dico, "dico.txt")
mot$ = ReadString(dico)
PrintN("Le mot est " +mot$)

PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("Appuyer sur Entree pour quitter")
Input()
J'aimerais juste une commande qui permet de sélectionner une ligne spécifique dans le fichier.
Par exemple au lieu de " mot$ = ReadString(dico) ", un truc du genre " mot$ = ReadString(dico, 2) " Ça lirait la ligne 2 du fichier dico.
Bien sur ce n'est qu'un exemple mais c'est quelque chose dans ce genre là.

Et pouvez vous me décrire les fonctions que vous utilisez ? Car vous me donnez un code déjà fait (dont je ne comprends pas tout) et j'aimerais adapter les fonctions à mon code.
Donc pouvez vous me dire comment marchent vos fonctions ?

Merci d'avance.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Apparemment tu es un vrai débutant...

Voiçi un code qui devrait faire ce que tu veux. Cependant moi j'utiliserais un tableau pour plus de simplicité.

Code : Tout sélectionner

Procedure.s ReadStringInFile(FileID, LineIndex)
  
  If LineIndex = 0
    LineIndex = 1
  EndIf
  
  For Index = 1 To LineIndex
    
    x_iemeChaine.s = ReadString(FileID)
    
  Next
  
  ProcedureReturn x_iemeChaine
EndProcedure

OpenConsole()
EnableGraphicalConsole(1)
ConsoleTitle("Le jeu du Pendu !")

Resultat = ReadFile(dico, "dico.txt")
mot$ = ReadStringInFile(dico, 3) ; la 3e ligne. On commence à 1
PrintN("Le mot est " +mot$)

PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("Appuyer sur Entree pour quitter")
Input()
A+
Guimauve
Dragor
Messages : 4
Inscription : dim. 19/oct./2008 17:36

Message par Dragor »

Merci pour cette réponse rapide.
Je vais essayer de déchiffrer tout ça ^^.

Sinon, j'ai suivi un cours de PureBasic et j'ai toujours pas compris à quoi servait une Procédure... Et comme j'ai vu que tu en utilise une, tu pourrais m'expliquer ?


J'ai compris que toutes les variables déclaré dans une procédures peuvent uniquement être utilisé dans cette procédure.
Mais j'vois pas trop à quoi ça sert...
Si on veut pas utiliser les une variable quelque part, on l'utilise pas...


Edit : Ligne 9, #File Objetc not initialized...
J'ai un peu de mal à comprendre (oui je suis un vrai débutant ^^ Un pur un dur ^^).
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Nouvelle version du code précédent. Je me suis rendu compte d'un problème si on voulant lire la ligne après la ligne 3 par exemple.

Code : Tout sélectionner

Procedure.s ReadStringInDico(DicoFileName.s, LineIndex)
  
  If ReadFile(0, DicoFileName)
    
    If LineIndex = 0
      LineIndex = 1
    EndIf
    
    For Index = 1 To LineIndex
      
      x_iemeChaine.s = ReadString(FileID)
      
    Next
    
    CloseFile(0)
  EndIf 
  
  ProcedureReturn x_iemeChaine
EndProcedure


OpenConsole()
EnableGraphicalConsole(1)
ConsoleTitle("Le jeu du Pendu !")

mot$ = ReadStringInFile("dico.txt", 3)
PrintN("Le mot est " +mot$)

PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("Appuyer sur Entree pour quitter")
Input()
Sinon, j'ai suivi un cours de PureBasic et j'ai toujours pas compris à quoi servait une Procédure... Et comme j'ai vu que tu en utilise une, tu pourrais m'expliquer ?
D'ordinaire on créer une procédure afin de grouper des instructions de base pour faire quelque chose de plus complexe. Dans la nouvelle version j'ai une procédure qui se charge d'ouvrir le dictionnaire, de lire toute les chaines jusqu'à ce qu'on lise celle qui nous intéresse. Ensuite on ferme le fichier et on retourne la chaine qu'on avait de besoin.
J'ai compris que toutes les variables déclaré dans une procédures peuvent uniquement être utilisé dans cette procédure.
Mais j'vois pas trop à quoi ça sert...
Si on veut pas utiliser les une variable quelque part, on l'utilise pas...
Une autre façon de faire du code précédent :

Code : Tout sélectionner

Global mot$

Procedure ReadStringInDico(DicoFileName.s, LineIndex)
  
  If ReadFile(0, DicoFileName)
    
    If LineIndex = 0
      LineIndex = 1
    EndIf
    
    For Index = 1 To LineIndex
      
      mot$ = ReadString(FileID)
      
    Next
    
    CloseFile(0)
  EndIf 

EndProcedure

OpenConsole()
EnableGraphicalConsole(1)
ConsoleTitle("Le jeu du Pendu !")

ReadStringInFile("dico.txt", 3)
PrintN("Le mot est " +mot$)

PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("Appuyer sur Entree pour quitter")
Input()
La variable Global peut-être modifié de partout dans le programme principal et dans les procédures. Sauf que moi je déteste ça, pour un programme simple ça peut toujours aller mais pour un gros programme on fini par être a court de nom pour les variables.
Edit : Ligne 9, #File Objetc not initialized...
J'ai un peu de mal à comprendre (oui je suis un vrai débutant ^^ Un pur un dur ^^).
Est-ce que le fichier dico.txt est dans le même répertoire que le code source que tu compile ?

A+
Guimauve
Dragor
Messages : 4
Inscription : dim. 19/oct./2008 17:36

Message par Dragor »

Oui le fichier est dans le même répertoire.

Et sinon, je crois avoir compris.

Enafites on peut, avec les procédures, avoir 2 fois la même variables. Enfin 2 fois le même nom non ?

Par exemple :

Code : Tout sélectionner

Procédure 1

blabla
life=500
blabla

EndProcédure


Procédure 2

blabla
life=1000
blabla

EndProcédure
J'espère avoir bien compris ^^
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Dragor a écrit :Oui le fichier est dans le même répertoire.

Et sinon, je crois avoir compris.

Enafites on peut, avec les procédures, avoir 2 fois la même variables. Enfin 2 fois le même nom non ?
C'est en plein ça.

A+
Guimauve
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Je me permet de te proposer une solution pour créer ton dico par le code ci-après :

Code : Tout sélectionner

;Création d'un fichier contenant les différents mots à découvrir grâce au jeu du pendu.
CreateFile(1,"Dico.txt")

;Ecriture de quelques mots à trouver mais il est possible de rajouter autant de mot sur une ligne que l'on veut avec un editeur type notepad par exemple

WriteStringN(1,"PUZZLES")
WriteStringN(1,"AVIRONS")
WriteStringN(1,"COULEUR")
WriteStringN(1,"VOITURE")
WriteStringN(1,"SKIEUSE")
WriteStringN(1,"AÉRONEF")

; Fermeture du fichier
CloseFile(1)
Le code qui fait suite te permettra de lire ce "Dico" et de tirage au hasard un mot parmi ceux en mémoire

Code : Tout sélectionner

;Ouverture du fichier
OpenFile(1,"Dico.txt")

; Mise en mémoire de touts les mots du 'Dico' dans une liste chainée
NewList Mots.s()
While Not Eof(1)
  AddElement(Mots())
  Mots()= ReadString(1)  
Wend
CloseFile(1)
;Tirage au hasard du numéro d'un mot

RandomSeed(Second(Date()))
For n=1 To 3

X = Random(ListSize(Mots())) -1 
SelectElement(Mots(),X)
MessageRequester("Résultat"," Le mot qui sera à trouver est : " + Mots() )

Next)
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

RandomSeed(Second(Date()))
Feinteur d'utiliser la date :P
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre