Читать текстовый файл с нулевым байтом - PullRequest
2 голосов
/ 22 декабря 2008

У меня есть текстовый файл с элементами dos - например, hex (00). Мне нужно прочитать это и преобразовать это. Я пытался использовать utf8toansi, но это удаляет всю строку с шестнадцатеричным (00). Есть ли способ конвертировать в текст во всем файле? Я использую win32, RadStudio2007, Delphi.

Ответы [ 3 ]

4 голосов
/ 23 декабря 2008

Это должно сделать ...

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;
2 голосов
/ 22 декабря 2008

Вы можете прочитать его в TMemoryStream, назначить PChar первому адресу и сканировать с циклом от 0 до Size - 1. Разумеется, вам решать, что вы хотите делать со встроенными символами # 0. Просто проигнорируйте # 13 и добавьте строку в каждую # 10, с которой вы сталкиваетесь.

EDIT:

Что-то вроде:

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;
0 голосов
/ 22 декабря 2008

Я не знаю Delphi, но я думаю, вам, вероятно, нужно открыть файл в виде двоичного файла, а не текстового файла. Затем вы можете читать байты напрямую и конвертировать их во что угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...