Dxe10 写文件时的问题

atgameover 2018-07-18 06:28:38
Stream.WriteBuffer(atr[1], length(aStr));
这一句在D7是没问题的,但在Dxe10里就有问题了,写入的字符串成下边这样了,怎么解决?
"W r o n g P a c k e t : "
每个字中间都多出了一个空格,而且还有部分字没写进去.
...全文
409 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38409885 2018-08-22
  • 打赏
  • 举报
回复
同意9楼的,或者你把它转成 ansitring,再保存试试。
lyhoo163 2018-08-22
  • 打赏
  • 举报
回复
还是习惯unicode,比较好
unicode就是双字节,习惯了就自然了。
  • 打赏
  • 举报
回复
WriteBuffer是写二进制数据,数据的内存结构是什么样的它就写成什么样,所以如果你只写一些string的话,用TStringList更方便,可以直接SaveToFile,字符编码也可以指定。
atgameover 2018-07-20
  • 打赏
  • 举报
回复
引用 8 楼 pathletboy 的回复:
delphi 2007以后的版本(不含)字符集已经默认是unicode,一个字符2字节,之前的版本默认ansi,#13在unicode是#13#0,所以你的#13+#10实际为#13#0+#10#0,你要理解字符集,才能正确的处理好文件读写。
这个我知道,就是不习惯,很别扭.
pathletboy 2018-07-20
  • 打赏
  • 举报
回复
引用 6 楼 atgameover 的回复:
通过测试
Stream.WriteBuffer(aStr[1], length(aStr));
改成:
Stream.WriteBuffer(aStr[1], length(aStr)*2);
就可以了.
另外,每行后要回车换行的话必须
'...'+ #13#10;
不能这样:
'....' + #13 + #10;
深感无语.


delphi 2007以后的版本(不含)字符集已经默认是unicode,一个字符2字节,之前的版本默认ansi,#13在unicode是#13#0,所以你的#13+#10实际为#13#0+#10#0,你要理解字符集,才能正确的处理好文件读写。
atgameover 2018-07-20
  • 打赏
  • 举报
回复
通过测试以下三种方法都可以正常使用: procedure writer(astr:string); var f: TStreamWriter; begin f := TStreamWriter.Create('test.txt', True, TEncoding.ANSI); try f.WriteLine(astr); finally f.Free; end; end; procedure WriteLog(aStr: string); var Stream: TFileStream; FileName: string; begin try FileName := '.\Err.Log'; if FileExists(FileName) then Stream := TFileStream.Create(FileName, fmOpenReadWrite) else Stream := TFileStream.Create(FileName, fmCreate); aStr := '[' + DateToStr(Date) + ' ' + TimeToStr(Time) + ']' + aStr + #13#10; Stream.Seek(0, soFromEnd); Stream.WriteBuffer(aStr[1], length(aStr) * 2); Stream.Free; except end; end; function WriteTxt(strWrite: string): boolean; var wLogFile: TextFile; DateTime: TDateTime; strTxtName, strContent: string; begin DateTime := now; strTxtName := ExtractFilePath(paramstr(0)) + FormatdateTime('yyyy-mm-dd', DateTime) + '.txt'; AssignFile(wLogFile, strTxtName); if FileExists(strTxtName) then Append(wLogFile) else ReWrite(wLogFile); strContent := FormatdateTime('tt', DateTime) + ' ' + strWrite; Writeln(wLogFile, strContent); CloseFile(wLogFile); Result := true; end; 再次感谢各位大神!
atgameover 2018-07-20
  • 打赏
  • 举报
回复
通过测试 Stream.WriteBuffer(aStr[1], length(aStr)); 改成: Stream.WriteBuffer(aStr[1], length(aStr)*2); 就可以了. 另外,每行后要回车换行的话必须 '...'+ #13#10; 不能这样: '....' + #13 + #10; 深感无语.
pathletboy 2018-07-20
  • 打赏
  • 举报
回复
var
f: TStreamWriter;

f := TStreamWriter.Create('test.txt', True, TEncoding.ANSI);
try
f.WriteLine('Hello World!');
finally
f.Free;
end;
atgameover 2018-07-20
  • 打赏
  • 举报
回复
var Stream: TFileStream; begin ........... Stream.WriteBuffer(aStr[1], length(aStr)); ........ 在d7里查看保存的文件正常, 在Dxe10里执行后查看保存文件,每个字中间都多了一个空格,在D7里用惯的方法在Dxe里却废了,好郁闷,各位大神都是怎么解决的?
秋天之落叶 2018-07-19
  • 打赏
  • 举报
回复
我只知道,XE10中,length(str)中的str不管是单字节还是双字节字符、全角还是半角,都是按照实际数量计算的,A、a、1、啊、【、[ 等,计算出来都是1。
lyhoo163 2018-07-19
  • 打赏
  • 举报
回复
到XE与D7,在字符的操作上,有很大的区别。转换不好,就会出错。二者默认字符不一样,一个是单字符,一个是双节。
chenjun_0312 2018-07-19
  • 打赏
  • 举报
回复
1.atr和aStr两个变量什么关系?
2.计算aStr的长度是否要计算Length(AnsiString(aStr)),这样才准吧。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧