FileSize() <> Zone mémoire contenant le fichier [Résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

FileSize() <> Zone mémoire contenant le fichier [Résolu]

Message par Kwai chang caine »

Bonjour à tous

Je viens d'avoir un probleme que tout le monde doit connaitre la solution, sauf moi :oops:

C'est la premiere fois que j'ai besoin de charger un fichier en mémoire et d'utiliser exactement le nombre d'octets
Et je me suis rendu compte, je ne sais par quelle tour de magie que l'espace mémoire d'un fichier chargé en elle est different de la longueur du fichier etant chargé 8O

Vous non plus vous ne comprenez pas, alors voila un dessin

Fichier Texte.txt

Code : Tout sélectionner

coucou
Code

Code : Tout sélectionner

Canal = ReadFile(#PB_Any, "Texte.txt")
  
Size = FileSize("Texte.txt")
*Buffer = AllocateMemory(Size)

Debug "Longueur du fichier = " + Str(size)

If *Buffer
 ReadData(Canal, *Buffer, Size)
 CloseFile(Canal)
EndIf

Debug "Longueur du buffer = " + Str(Len(PeekS(*Buffer)))
Debugger

Code : Tout sélectionner

Longueur du fichier = 6
Longueur du buffer = 14
Si quelqu'un peut m'éclairer :roll:
Y'a encore surement des caracteres "quequepart" cachés dans l'histoire :?

Merci et bonne journée
Dernière modification par Kwai chang caine le jeu. 30/juin/2011 17:56, modifié 1 fois.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: FileSize() <> Zone mémoire contenant le fichier

Message par falsam »

et comme ça ?

Code : Tout sélectionner

Canal = ReadFile(#PB_Any, "Texte.txt")
  
Size = FileSize("Texte.txt")
*Buffer = AllocateMemory(Size)

Debug "Longueur du fichier = " + Str(size)

If *Buffer
  LongueurLu=ReadData(Canal, *Buffer, Size)
  CloseFile(Canal)
EndIf

Debug "Longueur du buffer = " + Str(Len(PeekS(*Buffer,LongueurLu)))
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: FileSize() <> Zone mémoire contenant le fichier

Message par Kwai chang caine »

Merci FALSAM de ta reponse 8)
Effectivement ça marche comme ça, si je trouve pas pourquoi y'a cette difference je prendrais ta methode 8)

C'est a dire qu'en fait j'avais simplifié mon code pour faire ressortir le probleme
Mais je n'alloue pas la mémoire dans la meme procedure que je recupere la taille fichier
Mon code resssemble plus à ça, et je ne voulais pas faire de global

C'est quand meme dingue ce comportement ...qu'est ce qui peut faire cette difference ???
En plus ça ne le fait qu'avec certains fichiers :?

Code : Tout sélectionner

Procedure ChargeFichierEnMemoire(NomPage.s)

 Canal = ReadFile(#PB_Any, NomPage)
 
 If Canal
  
  Size = FileSize(NomPage)
  *Buffer = AllocateMemory(Size)

  If *Buffer
   ReadData(Canal, *Buffer, Size)
   CloseFile(Canal)
  EndIf
  
  ProcedureReturn *Buffer
  
 Else
  
  MessageRequester("", "La page ''" + NomPage + "'' ne peut etre affichée")
  
 EndIf
 
EndProcedure

*PtrMem = ChargeFichierEnMemoire("c:\Travail\Texte.txt")

Fichier$ = PeekS(*PtrMem)

Debug FileSize("c:\Travail\Texte.txt")
Debug Len(Fichier$)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Re: FileSize() <> Zone mémoire contenant le fichier

Message par Fred »

PeekS() s'arrete au premier 0 rencontré, et comme ton AllocateMemory() est pile la taille de ton fichier, le prochain 0 peut etre n'importe où.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: FileSize() <> Zone mémoire contenant le fichier

Message par nico »

il peut aussi y avoir une histoire de ascii et unicode, n'oublie pas qu'il y a une option pour peeks

sinon c'est lof(#fichier) que l'on utilise pour connaitre la taille d'un fichier et pas filesize
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: FileSize() <> Zone mémoire contenant le fichier

Message par Kwai chang caine »

Alors la......si j'tepate pas....je rentre au couvent de VB :oops:

D'abors j'ai fu le rouge, j'me suis jeté dessus
Apres j'ai du lire 20 fois ta phrase...sans trop comprendre :(

Puis "j'm'ai" dit: "KCC si c'te fois FRED y t'aide directement et t'arrive pas a comprendre..."
Alors une lueur m'est apparue, et j'ai cru comprendre que tu disais que a la fin de mon fichier y'a pas obligatoirement un 0

Alors mes doigts boudinés n'ont fait qu'un tour, et j'en ai rajouté un :D ai-je bienfait ??? :roll:
Voyant le résultat, j'me suis levé et j'ai crié seul dans mon bureau :
Je marche !!!!! je marche !!!!! je marche !!!!! 8O

Ah non...ça je marchais déjà avant :?
Je veux dire ça marche !!!! ça marche !!!

Code : Tout sélectionner

Procedure ChargeFichierEnMemoire(NomPage.s)

Canal = ReadFile(#PB_Any, NomPage)

If Canal
  
  Size = FileSize(NomPage)
  *Buffer = AllocateMemory(Size + 1)

  If *Buffer
   ReadData(Canal, *Buffer, Size)
   PokeL(*Buffer + Size,0)
   CloseFile(Canal)
  EndIf
  
  ProcedureReturn *Buffer
  
Else
  
  MessageRequester("", "La page ''" + NomPage + "'' ne peut etre affichée")
  
EndIf

EndProcedure

*PtrMem = ChargeFichierEnMemoire("c:\Travail\Texte.txt")

Fichier$ = PeekS(*PtrMem)

Debug FileSize("c:\Travail\Texte.txt")
Debug Len(Fichier$)
Comment tu veux que je tombe pas amoureux :mrgreen:

Mille merci FRED 8)
Dernière modification par Kwai chang caine le jeu. 30/juin/2011 17:28, modifié 1 fois.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: FileSize() <> Zone mémoire contenant le fichier

Message par Kwai chang caine »

nico a écrit :il peut aussi y avoir une histoire de ascii et unicode, n'oublie pas qu'il y a une option pour peeks
sinon c'est lof(#fichier) que l'on utilise pour connaitre la taille d'un fichier et pas filesize
Bonjour NICO

Oui, j'avais pensé a cette histoire d'ASCII/UNICODE
Ce qui est le plus dingue c'est que tu lance le code et la reponse est pas toujours pareil pour le meme fichier 8O

Pour l'histoire du LOF je ne savais pas, merci 8)
Je vais aussi rajouter l'extension on sait jamais :wink:

Encore merci
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Re: FileSize() <> Zone mémoire contenant le fichier

Message par Fred »

Oui, c'est ca. A noter qu'AllocateMemory() met deja toute la memoire à 0, donc le poke n'est pas nécessaire.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: FileSize() <> Zone mémoire contenant le fichier

Message par Kwai chang caine »

j'en reviens pas...j'y suis arrivé presque tout seul a corriger 8O
J'espere que t'es fier de ce qu'on deviens :mrgreen:
Mon idole a écrit :Oui, c'est ca. A noter qu'AllocateMemory() met deja toute la memoire à 0, donc le poke n'est pas nécessaire.
Aaaah, je viens de comprendre pourquoi dans les codes les copains qui savent coder, ils rajoutent + 1 au allocatememory
Moi je croyais que c'etait pour avoir plus de place des fois que ça "deborde"
Ouaff ouaff ce KCC quel bouffon :lol:

Et n'oublie pas..du repos ...du repos....pour que tu nous survive à tous :D
Je te souhaite, une tres bonne soirée

Et encore merci aux autres copains qui m'ont aidé 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre