Page 1 sur 1

Fichier TXT en data binaire ?

Publié : mer. 29/janv./2020 8:10
par PhM
Bonjour,

Pour inclure une image extérieure en binaire dans le programme cela est facile :

Code : Tout sélectionner

UsePNGImageDecoder()
If CatchImage(1, ?Img_Start1, ?Img_End1 - ?Img_Start1)  : EndIf

DataSection
  Img_Start1:
  IncludeBinary "PHM\parametre.png"
  Img_End1:
EndDataSection
MAIS, est-il possible de faire la même chose avec un fichier texte extérieur et, dans ce cas, quelle est la manière de l'appeler ?

Code : Tout sélectionner

Appel du fichier txt extérieur ?

DataSection
  TRADUC_debut:
  IncludeBinary "PHM\Traductions.txt"
  TRADUC_fin:
EndDataSection

Re: Fichier TXT en data binaire ?

Publié : mer. 29/janv./2020 9:49
par Micoute
Avec ReadFile() ?

Re: Fichier TXT en data binaire ?

Publié : mer. 29/janv./2020 10:23
par Marc56
ReadFile() est valable pour un chargement dynamique, donc solution valable si on veut par exemple utiliser plusieurs fichiers de langues.

Je crois que ce que souhaite PhM c'est d'incorporer le fichier dans l'EXE ?

Utiliser IncludeBinay est possible, mais cette commande va charger tout le fichier tel quel dans une zone mémoire. Il faudra ensuite utiliser des instructions comme PeekS() pour extraire les données texte et les replacer dans des variables. Faisable mais un peu long.

Une solution plus simple est d'utiliser IncludeFile et de formater le fichier de traduction comme s'il faisait partie du code source de la section DataSection. IncludeFile va donc faire comme un simple copier/coller au moment de compiler.

Exemple de fichier traduction.txt

Code : Tout sélectionner

Data.s "Hello", "Bonjour"
Data.s "World", "Monde"
Data.s "EOT", ""
Note le EOT: (End OF Text) que j'utilise pour arrêter ensuite la lecture. Comme ceci, on peut ajouter des lignes et lire ensuite avec Read sans s'occuper du nombre de ligne ni provoquer une IMA.

Ensuite, s'il s'agit de traduction, le mieux est d'utiliser une Map
Exemple (un peu verbeux)

Code : Tout sélectionner

NewMap Traductions$()

Repeat
    Read.s Tmp_Us$
    If Tmp_Us$ = "EOT" : Break : EndIf
    Read.s Tmp_Fr$
    AddMapElement(Traductions$(), Tmp_Us$) 
    Traductions$() = Tmp_Fr$ 
ForEver 

Debug "--- Lecture Map"
ForEach Traductions$()
    Debug MapKey(Traductions$()) + " = " +Traductions$()    
Next

End

DataSection
    Traductions:
    IncludeFile "PHM\Traductions.txt"
EndDataSection
Ce qui donne

Code : Tout sélectionner

--- Lecture Map
World = Monde
Hello = Bonjour
:wink:

Re: Fichier TXT en data binaire ?

Publié : mer. 29/janv./2020 11:13
par PhM
Merci pour vos réponses. Oui, je souhaitais bien incorporer le fichier texte dans le programme.

L'explication de Marc56 est claire mais ne donne pas les résultats espérés pour moi.
La cause vient du fait que j'ai 9 langues différentes, dont le polonais et le russe qui au retour de chargement ont des caractères complètements "chamboulés" !

ligne d'origine : A propos...;On propos...;Auf Vorschlag...;En la propuesta...;Su proposta...;Op voorstel...;Na propozycję...;По предложению...

ligne en retour : A propos...;On propos...;Auf Vorschlag...;En la propuesta...;Su proposta...;Op voorstel...;Na propozycję...;По предложению...

Je vais donc incorporer les lignes en data.s classique en espérant que les retours soient conformes aux originaux.

Re: Fichier TXT en data binaire ?

Publié : mer. 29/janv./2020 11:45
par Marc56
Les caractères illisibles, c'est juste une question d'encodage: Utilise un éditeur de texte qui sauvegarde en Utf-8
(ou tout simplement l'éditeur PB en vérifiant Fichier > Format de fichier > Utf-8)
qui est de toutes façons le format conseillé pour tout.

Avec 8 langues, tu ne peux utiliser une map. Utilise par exemple un tableau à deux dimensions.

:wink:

Re: Fichier TXT en data binaire ?

Publié : mer. 29/janv./2020 18:54
par Naheulf
Marc56 a écrit :Avec 8 langues, tu ne peux utiliser une map. Utilise par exemple un tableau à deux dimensions.
Heuuu....
Si c'est pour avoir les traductions dans ton programme, une seule map est suffisante. Sauf cas très particulier, tu n'aura besoin de charger qu'une seule langue à la fois.