Page 1 sur 1
FileSize() <> Zone mémoire contenant le fichier [Résolu]
Publié : jeu. 30/juin/2011 16:03
par Kwai chang caine
Bonjour à tous
Je viens d'avoir un probleme que tout le monde doit connaitre la solution, sauf moi
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é
Vous non plus vous ne comprenez pas, alors voila un dessin
Fichier Texte.txt
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
Si quelqu'un peut m'éclairer
Y'a encore surement des caracteres "quequepart" cachés dans l'histoire
Merci et bonne journée
Re: FileSize() <> Zone mémoire contenant le fichier
Publié : jeu. 30/juin/2011 16:20
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)))
Re: FileSize() <> Zone mémoire contenant le fichier
Publié : jeu. 30/juin/2011 16:51
par Kwai chang caine
Merci FALSAM de ta reponse

Effectivement ça marche comme ça, si je trouve pas pourquoi y'a cette difference je prendrais ta methode
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$)
Re: FileSize() <> Zone mémoire contenant le fichier
Publié : jeu. 30/juin/2011 17:09
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ù.
Re: FileSize() <> Zone mémoire contenant le fichier
Publié : jeu. 30/juin/2011 17:14
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
Re: FileSize() <> Zone mémoire contenant le fichier
Publié : jeu. 30/juin/2011 17:23
par Kwai chang caine
Alors la......si j'tepate pas....je rentre au couvent de VB
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

ai-je bienfait ???
Voyant le résultat, j'me suis levé et j'ai crié seul dans mon bureau :
Je marche !!!!!
je marche !!!!! je marche !!!!!
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
Mille merci FRED

Re: FileSize() <> Zone mémoire contenant le fichier
Publié : jeu. 30/juin/2011 17:27
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
Pour l'histoire du LOF je ne savais pas, merci
Je vais aussi rajouter l'extension on sait jamais
Encore merci
Re: FileSize() <> Zone mémoire contenant le fichier
Publié : jeu. 30/juin/2011 17:46
par Fred
Oui, c'est ca. A noter qu'AllocateMemory() met deja toute la memoire à 0, donc le poke n'est pas nécessaire.
Re: FileSize() <> Zone mémoire contenant le fichier
Publié : jeu. 30/juin/2011 17:54
par Kwai chang caine
j'en reviens pas...j'y suis arrivé presque tout seul a corriger

J'espere que t'es fier de ce qu'on deviens
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
Et n'oublie pas..du repos ...du repos....pour que tu nous survive à tous
Je te souhaite, une tres bonne soirée
Et encore merci aux autres copains qui m'ont aidé
