2009-09-16 9 views
13

mam Delphi kod 2007, który wygląda tak:Pisanie ciąg do TFileStream w Delphi 2010

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

nazywam go tak:

var 
    SourceBuffer : PChar; 
    MyFile: TFileStream; 

.... 

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

ta pracowała w Delphi 2007, ale daje mi dużo niechcianych postaci w Delphi 2010. Wiem, że to jest spowodowane problemami z niezgodnością z Unicode, ale nie jestem pewien, jak rozwiązać ten problem.

Oto co próbowałem dotąd:

  • Zmień typ danych SourceBuffer (a także parametr oczekiwaniami WideString) do PWideChar

  • Każdy z suggestions listed here

Co robię źle?

Odpowiedz

14

Nie potrzebujesz oddzielnego bufora, aby napisać ciąg do strumienia. Prawdopodobnie najprostszym sposobem na to jest do kodowania znaków na UTF-8, tak jak poniżej:

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; 

Mam deklarowaną TStreamEx jako klasy pomocnika dla TStream, ale to nie powinno być zbyt trudne, aby przerobić je jako procedura solo i funkcja podobna do twojego przykładu.

+1

Ten pracował dla mnie po usunięciu "self.WriteBuffer (len, 4);" - to było pisanie bełkotliwych znaków do pliku wyjściowego. – JosephStyons

+4

Te "bełkotliwe znaki" to długość napisu, więc funkcja czytania wie, ile można odczytać. Jeśli potrzebujesz tego jako zwykłego tekstu, będziesz potrzebował innego sposobu, aby powiedzieć readString, gdzie zatrzymać. –

+0

Piszę ten plik dla innej aplikacji, aby go wczytać, więc nie jest ważne, czy będę mógł go ponownie wczytać. – JosephStyons

12

Delphi 2010 ma ładny rozwiązanie dla tego, udokumentowany tutaj:

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

Link jest uszkodzony. Wygląda tak: http://docwiki.embarcadero.com/CodeExamples/en/StreamStrRdWr_%28Delphi%29 – jonjbar

+1

John, dzięki za poprawienie linku. Wygląda na to, że narusza złotą zasadę dotyczącą stron internetowych - nigdy nie rób permalinka. Zwłaszcza dla trywialnej zmiany nazwy URL takiej jak ta. –

Powiązane problemy