Comment lire le contenu du fichier dans une chaîne de caractères dans delphi XE
Je suis migrer mon application à partir de delphi 2007 pour delphi xe, mais j'ai eu des problèmes avec une procédure de lecture d'un fichier (ascii) et stocker le contenu dans une chaîne
c'est le code qui travaillent sur ok dans delphi 2007
function LoadFileToStr(const FileName: TFileName): String;
var
FileStream : TFileStream;
begin
FileStream:= TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
if FileStream.Size>0 then
begin
SetLength(Result, FileStream.Size);
FileStream.Read(Pointer(Result)^, FileStream.Size);
end;
finally
FileStream.Free;
end;
end;
mais quand exécuter ce code en delphi XE le résultat sont des symboles comme '????????', je sais qui delphi xe est unicode j'ai donc modifier ces lignes
SetLength(Result, FileStream.Size);
FileStream.Read(Pointer(Result)^, FileStream.Size);
à
SetLength(Result, FileStream.Size*2);
FileStream.Read(Pointer(Result)^, FileStream.Size);
pour stocker le contenu du fichier dans la chaîne unicode, mais le résultat est le même.
how i can fix this procedure to read the content of this file?
Soyez prudent avec TStringList, parce que si le "texte" fichier contient en quelque sorte ASCII NUL (0x00) caractères, l'analyseur s'arrête et vous vous retrouvez avec moins de lignes que de réellement dans le fichier.
OriginalL'auteur DelphiNewbie | 2011-05-23
Vous devez vous connecter pour publier un commentaire.
vous code ne fonctionne pas parce que vous êtes de lire le contenu du fichier à l'aide d'une chaîne unicode comme un tampon, de sorte que vous êtes simplement en déplaçant les octets de la mémoire tampon interne de la TFileStream de la chaîne unicode en ignorant l'encodage.
vous pouvez fixer facilement votre procédure , simplement en changeant le type de résultat à
AnsiString
mais je vous recommande que vous utilisez le
TFile.ReadAllText
fonction de la place qui, dans une seule ligne de code lire le contenu d'un fichier a également gérer l'encodage du fichier.OriginalL'auteur RRUZ
Vous pouvez réaliser cela avec une seule ligne de code à l'aide de ReadAllText fonction. Comme ceci:
Il va détecter correctement la norme ANSI, Unicode et les fichiers binaires.
(Maintenant, je vois RRuz déjà recommandé de faire de même).
OriginalL'auteur Rigel
Vous devriez prendre l'encodage en compte, par exemple:
OriginalL'auteur kludg
Je recommande d'utiliser un TStringList pour charger le contenu du fichier, puis définir le résultat de la variable.De texte, par exemple:
De cette façon, vous n'avez pas à vous soucier de quoi que ce soit, il sera en arrière et futurs compatible à mon humble avis.
EDIT: Si vous avez besoin de charger à partir d'un TStream descendant, puis remplacez LoadFromFile avec LoadFromStream.
OriginalL'auteur ComputerSaysNo