各位老大们,问题是这样的,在一个Java写的程序运行中会产生一个日志文件,现在要用Delphi写的程序打开这个日志文件,这时问题就出来了,每次读到一个用UltraEdit打开这个文件并且切换到十六进制编辑模式下十六进制编码显示为“00”的字符就没有办法读取了(这不是空格符,空格符的十六进制编码是“20”),Delphi就好像默认为文件结束了,请问一下高手们怎样才能把带有这样字符(文件中有十六进制编码为“00”的字符)的文件完全读取???
请写出代码,有实例可以发到邮箱:[email protected]
[email protected]小弟万分感谢,分不够可以再加。
请写出代码,有实例可以发到邮箱:[email protected]
[email protected]小弟万分感谢,分不够可以再加。
解决方案 »
- 在子线程里访问主线程的控件出错!?
- Delphi 中ADOQUERY 三级字表的批量提交问题
- intraweb的datamodoul里怎么用ado数据库连接呢?
- 数据用sql备份的问题,给分100
- 如何用DELPHI做一个网页浏览器?
- 问:Delphi中有没有类似VC里的CMap的类呢?
- 怎么才能知道扫描仪是否打开?
- 问题还是没解决,我就不信这么多“高手”在这里,一个简单的问题会搞不定,再问
- 将监听windows盘符变化的事件放dll中,编译时就出错了。
- 如何动态加载bpl并调用其中的类函数
- 将HTML中的表格转换成CSV格式文件。
- 急救!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ReadBuffer....你想讀多少就是多少 不過實際讀入的是其返回值你可以一次讀定量得數據 或者 一次全部讀完 文件長度可以用 api GetFileSize 獲取。。
Stream: TStream;
S: string;
begin
Stream := TFileStream.Create('C:\1.txt', fmOpenRead);
SetLength(S, Stream.Size);
Stream.Read(S[1], Stream.Size); // 字符串S即为完整的文本文件内容。
Stream.Free;
end;
用TFilestream
var
hFile: DWORD;
iSize: DWORD;
sTemp: string;
begin
// 打开文件
hFile := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // 文件大小
iSize := GetFileSize(hFile, nil); // 申请内存
SetLength(sTemp, iSize + 2); // 读入文件
ReadFile(hFile, sTemp[1], iSize, iSize, nil); // 关闭文件
CloseHandle(hFile); // 置结束符
sTemp[iSize + 1] := #0;
sTemp[iSize + 2] := #0; // 编码格式
if (sTemp[1] = #$FF) and (sTemp[2] = #$FE) then // UNICODE
begin
// 申请内存
SetLength(Result, iSize);
// 转换编码
WideCharToMultiByte(CP_ACP, 0, PWideChar(@sTemp[3]), -1, @Result[1], iSize, nil, nil);
end else
Result := sTemp; // 去除多余
Result := string(PChar(Result));
end;
因为这个用Java程序生成的日志文件中有许多地方都有这种编码显示,我必须得让他们全部读出来!继续等待中.......
procedure TForm1.Button1Click(Sender: TObject);
const
cNullChar: Char = '?';
var
S: string;
I: Integer;
begin
with TMemoryStream.Create do try
LoadFromFile('c:\temp\temp.log');
if Size <= 0 then Exit;
SetLength(S, Size);
Read(S[1], Size);
for I := 1 to Length(S) do
case S[I] of
#0..#8, #14..#31: S[I] := cNullChar;
end;
finally
Free;
end;
Memo1.Text := S;
end;
我上面的程序是试过的,TFileStream什么都可以读出来,不可能有读不出的情况。
之所以你以为没有读出来,是因为你读出来之后企图拿到Memo或者RichEdit中显示,那是不可能显示完整的。还是我那段程序,你创建一个文本文件 C:\1.txt,用UE在十六进制编辑模式下写“31 00 00 00 00 00 32”并保存。
var
Stream: TStream;
S: string;
begin
Stream := TFileStream.Create('C:\1.txt', fmOpenRead);
SetLength(S, Stream.Size);
Stream.Read(S[1], Stream.Size); // 字符串S即为完整的文本文件内容。
Stream.Free; <-- 把断点设在这里看S的值,你就明白了。
ShowMessage(S); // 这句为了使Delphi的优化不得提早释放S
end;
asm
PUSH EDI
PUSH ECX // A
PUSH EDX // Len CALL UniqueString
POP ECX
LEA EDI, [EAX] // EDI <- @S[1]
POP EAX
CLC
@@L_1:
TEST BYTE PTR [EDI], $FF
JNZ @@L_2
STOSB
JMP @@L_3
@@L_2:
INC EDI
@@L_3:
DEC ECX
JNZ @@L_1
POP EDI
end;调用示例:var
S: string;
begin
S := #$31#0#0#0#0#0#$32;
ReplaceZeroStr(S, Length(S), '^');
ShowMessage(S);
end;
CLC
请改成
CLD