2008-12-22 11 views
2

J'ai un fichier texte avec des éléments dos - hex (00) pour exampel. J'ai besoin de le lire et de le convertir. J'ai essayé d'utiliser utf8toansi, mais cela supprime toute la ligne avec hex (00). Y a-t-il un moyen de convertir en texte dans le fichier entier? J'utilise win32, RadStudio2007, Delphi.Lire le fichier texte avec l'octet nul nul

+0

résumé de la question et le texte est fortement trompeur. Tout ce que l'OP veut faire est de supprimer/remplacer certains caractères du fichier et de les réécrire. Pas besoin de faire cela avec Delphi, utilisez des outils de ligne de commande standard à la place. – mghie

+0

Merci beaucoup d'avoir répondu :) J'ai essayé la dernière solution (ConvertFileToDos) et ça semble bien fonctionner pour moi :) – user15138

+0

Désolé, mais je n'aurais jamais deviné à la question que vous vouliez convertir un fichier texte en un format différent. Pourquoi utiliser Delphi du tout dans ce cas? Que diriez-vous des outils standard comme tr, sed, awk? – mghie

Répondre

4

Cela devrait faire ...

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

Vous pouvez le lire dans un TMemoryStream, assigner un PChar à la première adresse, et numériser avec une boucle de 0 à Taille - 1. C'est à vous de décider ce que vous voulez faire avec les caractères # 0 incorporés. Ignorez simplement le # 13 et ajoutez une chaîne sur chaque # 10 que vous rencontrez.

EDIT:

Quelque chose comme:

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

TMemoryStream a une méthode LoadFromFile, évitant l'intermédiaire TFileStream. Notez également que la création de la chaîne d'un caractère à la fois est une mauvaise idée. Stockez la position de départ et la longueur, puis utilisez SetString. –

+0

Je l'ai mis ensemble dans Delphi 4, où il n'y a pas TFileStream.LoadFromFile(), mais c'est bien sûr une très bonne idée pour les versions ultérieures de Delphi. Re 2) - c'est un très bon commentaire, et je ne le ferais jamais en code de production, j'utiliserais deux PChars. Mais je ne voulais pas trop compliquer l'exemple ... – mghie

0

Je ne sais pas Delphi, mais je pense que vous avez probablement besoin d'ouvrir le fichier en tant que fichier binaire et non un fichier texte. Ensuite, vous pouvez lire les octets directement et les convertir en ce que vous voulez.