使用空字节读取文本文件

时间:2008-12-22 16:06:50

标签: windows delphi text

我有一个带dos元素的文本文件 - 例如hex(00)。我需要阅读并转换它。我曾尝试使用utf8toansi,但这会删除整个行(十六进制(00))。有没有办法在整个文件中转换为文本? 我使用的是win32RadStudio2007Delphi

3 个答案:

答案 0 :(得分:4)

这应该......

procedure ConvertFileToDos(const aInFile,aOutFile:String);
var
  FileIn,FileOut:TextFile;
  C:AnsiChar;
  LineBreak:String;
begin
  LineBreak := #13#10;

  AssignFile(FileIn,aInFile);
  Reset(FileIn);

  AssignFile(FileOut,aOutFile);
  ReWrite(FileOut);

  while not EOF(FileIn) do
  begin
    Read(FileIn,C);
    if C=#0 then
      Write(FileOut,LineBreak)
    else
      Write(FileOut,C)
  end;

  CloseFile(FileIn);
  CloseFile(FileOut);
end;

答案 1 :(得分:2)

您可以将其读入TMemoryStream,将PChar分配给第一个地址,然后使用从0到大小的循环进行扫描 - 1.当然,您需要使用嵌入式#0字符进行扫描。只需忽略#13并在遇到的每个#10上添加一个字符串。

修改

类似的东西:

procedure TForm1.Button1Click(Sender: TObject);
var
  FileStream: TStream;
  MemStream: TMemoryStream;
  P: PChar;
  s: string;
  i: integer;
begin
  FileStream := TFileStream.Create('file.txt', fmOpenRead);
  try
    MemStream := TMemoryStream.Create;
    try
      MemStream.LoadFromStream(FileStream);
      P := PChar(MemStream.Memory);
      s := '';
      for i := 0 to MemStream.Size - 1 do begin
        case P[0] of
          #0: {};
          #10: begin
                 // do something with s
                 s := '';
               end;
          #13: {};
        else
          s := s + P[0];
        end;
        Inc(P);
      end;
    finally
      MemStream.Free;
    end;
  finally
    FileStream.Free;
  end;
end;

答案 2 :(得分:0)

我不知道Delphi,但我猜你可能需要打开文件作为二进制文件而不是文本文件。然后你可以直接读取字节并将它们转换成你想要的任何字符。