2009-09-16 7 views
13

Je Delphi Code 2007 qui ressemble à ceci:écriture d'une chaîne à une TFileStream Delphi 2010

procedure WriteString(Stream: TFileStream; var SourceBuffer: PChar; s: string); 
begin 
    StrPCopy(SourceBuffer,s); 
    Stream.Write(SourceBuffer[0], StrLen(SourceBuffer)); 
end; 

Je l'appelle comme ceci:

var 
    SourceBuffer : PChar; 
    MyFile: TFileStream; 

.... 

SourceBuffer := StrAlloc(1024); 
MyFile := TFileStream.Create('MyFile.txt',fmCreate); 
WriteString(MyFile,SourceBuffer,'Some Text'); 
.... 

Cela a fonctionné dans Delphi 2007, mais me donne beaucoup de caractères indésirables dans Delphi 2010. Je sais que cela est dû à des problèmes de conformité Unicode, mais je ne suis pas sûr de savoir comment résoudre le problème.

Voici ce que j'ai essayé jusqu'à présent:

  • Modifier le type de données de SourceBuffer (et aussi le paramètre attendu par WideString) à PWIDECHAR

  • Chacun des suggestions listed here

Qu'est-ce que je fais mal?

Répondre

14

Vous n'avez pas besoin d'un tampon séparé pour écrire une chaîne dans un flux. Probablement la façon la plus simple de le faire est de coder la chaîne à UTF8, comme ceci:

procedure TStreamEx.writeString(const data: string); 
var 
    len: cardinal; 
    oString: UTF8String; 
begin 
    oString := UTF8String(data); 
    len := length(oString); 
    self.WriteBuffer(len, 4); 
    if len > 0 then 
     self.WriteBuffer(oString[1], len); 
end; 

function TStreamEx.readString: string; 
var 
    len: integer; 
    iString: UTF8String; 
begin 
    self.readBuffer(len, 4); 
    if len > 0 then 
    begin 
     setLength(iString, len); 
     self.ReadBuffer(iString[1], len); 
     result := string(iString); 
    end; 
end; 

J'ai déclaré TStreamEx comme aide de classe pour TStream, mais il ne devrait pas être trop difficile de réécrire ces derniers comme procédure en solo et fonction comme votre exemple.

+1

Cela a fonctionné pour moi après j'ai enlevé le "self.WriteBuffer (len, 4);" - Qui écrivait des caractères charabia dans le fichier de sortie. – JosephStyons

+4

Ces "caractères charabia" sont la longueur de la chaîne, donc la fonction de lecture sait combien de lire. Si vous avez besoin que ce soit du texte brut, vous aurez besoin d'une autre façon de dire à readString où s'arrêter. –

+0

J'écris ce fichier pour qu'il soit lu par une autre application, il n'est donc pas important que je puisse le relire. – JosephStyons

12

Delphi 2010 a une bonne solution pour cela, documenté ici:

http://docwiki.embarcadero.com/CodeExamples/en/StreamStrRdWr_%28Delphi%29

var 
    Writer: TStreamWriter; 
... 

    { Create a new stream writer directly. } 
    Writer := TStreamWriter.Create('MyFile.txt', false, TEncoding.UTF8); 
    Writer.Write('Some Text'); 

    { Close and free the writer. } 
    Writer.Free(); 
+4

Le lien est rompu. Ressemble à celui-ci: http://docwiki.embarcadero.com/CodeExamples/en/StreamStrRdWr_%28Delphi%29 – jonjbar

+1

John, merci pour la correction du lien. Ressemble à une violation de la règle d'or pour les sites Web - ne jamais rompre un permalien. Particulièrement pour une renommée d'URL triviale comme celle-ci. –

Questions connexes