Delphi 2010에서 tfilestream에 문자열을 작성합니다
-
07-07-2019 - |
문제
다음과 같은 것처럼 보이는 Delphi 2007 코드가 있습니다.
procedure WriteString(Stream: TFileStream; var SourceBuffer: PChar; s: string);
begin
StrPCopy(SourceBuffer,s);
Stream.Write(SourceBuffer[0], StrLen(SourceBuffer));
end;
나는 이것을 다음과 같이 부릅니다.
var
SourceBuffer : PChar;
MyFile: TFileStream;
....
SourceBuffer := StrAlloc(1024);
MyFile := TFileStream.Create('MyFile.txt',fmCreate);
WriteString(MyFile,SourceBuffer,'Some Text');
....
이것은 Delphi 2007에서 작동했지만 Delphi 2010에서 많은 정크 캐릭터를 제공합니다. 이것이 유니 코드 준수 문제 때문이라는 것을 알고 있지만 문제를 해결하는 방법은 확실하지 않습니다.
지금까지 시도한 내용은 다음과 같습니다.
SourceBuffer의 데이터 유형 (및 widestring이 예상 한 매개 변수)을 pwidechar로 변경
모든 것 여기에 나열된 제안
내가 뭘 잘못하고 있죠?
해결책
스트림에 문자열을 쓰기 위해 별도의 버퍼가 필요하지 않습니다. 아마도 가장 간단한 방법은 문자열을 UTF8로 인코딩하는 것입니다.
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;
TSTREAMEX를 TSTREAM의 클래스 도우미로 선언했지만이를 솔로 절차로 다시 작성하고 예제처럼 기능하는 것은 너무 어렵지 않아야합니다.
다른 팁
Delphi 2010은 여기에 문서화 된 훌륭한 솔루션이 있습니다.
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();
제휴하지 않습니다 StackOverflow