Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Guardar un txt con formato UNIX (https://www.clubdelphi.com/foros/showthread.php?t=35085)

dayrontbs 31-08-2006 00:36:47

Guardar un txt con formato UNIX
 
Hola amigos, pues esto me urge la verdad, como puedo guardar una informacion que tengo en un MEMO en formato UNIX.

Casimiro Notevi 31-08-2006 00:41:47

Cita:

Empezado por dayrontbs
Hola amigos, pues esto me urge la verdad, como puedo guardar una informacion que tengo en un MEMO en formato UNIX.

Puedes quitarle los return -> chr(13) -> hex0D y dejarle sólo los avances de líneas -> chr(10) -> hex0A

Creo que hay una función ya para hacerlo automáticamente, aunque tampoco es muy complicado recorrer el texto e ir eliminando el #13

seoane 31-08-2006 01:05:53

Hoy tengo ganas de programar :p :

Código Delphi [-]
function SaveToUnixFile(Filename, Text: String): Boolean;
var
  F: File;
  Escritos: Integer;
begin
  Result:= FALSE;
  AssignFile(F,Filename);
  {$I-}
    Rewrite(F,1);
  {$I+}
  if IOResult = 0 then
  begin
    Text:= StringReplace(Text,#13,EmptyStr,[rfReplaceAll]);
    BlockWrite(F,PChar(Text)^,Length(Text),Escritos);
    Result:= Escritos = Length(Text);
    CloseFile(F);
  end;
end;


// Por ejemplo
SaveToUnixFile('C:\1.txt',Memo1.Text);

roman 31-08-2006 03:16:10

Otra opción:

Código Delphi [-]
procedure SaveToUnix(FileName, Text: String);
var
  Stream: TFileStream;
  Buffer: String;

begin
  Buffer := AdjustLineBreaks(Text, tlbsLF);

  Stream := TFileStream.Create(FileName, fmCreate);
  try
    Stream.WriteBuffer(Buffer[1], Length(Buffer));
  finally
    Stream.Free;
  end;
end;

// Saludos

seoane 31-08-2006 04:00:16

Otra mas:

Código Delphi [-]
function SaveToUnixFile(Filename, Text: String): Boolean;
var
  F: File;
  Escritos: Integer;
  P1, P2: PChar;
  i: Integer;
begin
  P1:= PChar(Text);
  P2:= P1;
  i:= 0;
  while Boolean(P2^) do
  begin
    if P2^ <> #13 then
    begin
      P1^:= P2^;
      inc(P1);
      inc(i);
    end;
    inc(P2);
  end;
  Result:= FALSE;
  AssignFile(F,Filename);
  {$I-}
    Rewrite(F,1);
  {$I+}
  if IOResult = 0 then
  begin
    BlockWrite(F,PChar(Text)^,i,Escritos);
    Result:= Escritos = i;
    CloseFile(F);
  end;
end;

dec 31-08-2006 04:11:04

Hola,

Otra opción más:

Código Delphi [-]
{ Not yet implement }

¡Cómo está el personal, oiga! :D :D :cool:

roman 31-08-2006 04:14:39

Tengo la impresión de que la próxima de seoane va a lucir así:

Código Delphi [-]
function SaveToUnixFile(Filename, Text: String): Boolean;
asm

...

end;

:D

// Saludos

Héctor Randolph 31-08-2006 09:28:37

Al parecer este hilo va tomando esta forma:

The Evolution of Programmer :D :D

Saludos

seoane 31-08-2006 13:20:42

Cita:

Empezado por roman
Tengo la impresión de que la próxima de seoane va a lucir así:

Código Delphi [-]
function SaveToUnixFile(Filename, Text: String): Boolean;
asm

...

end;

:D

// Saludos

Lo pensé, pero creo que voy a dejarlo así :cool: :D

roman 31-08-2006 14:24:54

Por fin he podido parar de reir con el enlace de Héctor :D

No te detengas hombre. La verdad es que este tipo de rutinas pueden ser muy útiles y si se requieren para procesar muchos archivos y grandes, hacerlo en ensamblador puede ser una muy buena idea.

Por cierto, en un programa que uso, tiene la opción de guardar además en formato Mac. En PC tenemos #13#10, en Unix tenemos #10, ¿cómo es en Mac? ¿El #13 solito? ¿#10#13?

// Saludos

Casimiro Notevi 31-08-2006 15:04:14

Cita:

Empezado por roman
Por fin he podido parar de reir con el enlace de Héctor :D

No te detengas hombre. La verdad es que este tipo de rutinas pueden ser muy útiles y si se requieren para procesar muchos archivos y grandes, hacerlo en ensamblador puede ser una muy buena idea.

Por cierto, en un programa que uso, tiene la opción de guardar además en formato Mac. En PC tenemos #13#10, en Unix tenemos #10, ¿cómo es en Mac? ¿El #13 solito? ¿#10#13?

// Saludos

Imagino que como los Mac OS provienen del BSD, que es un unix, deben ser igual que linux.

¿alguien tiene uno?

seoane 31-08-2006 16:00:17

Cita:

Empezado por Casimiro Notevi
Imagino que como los Mac OS provienen del BSD, que es un unix, deben ser igual que linux.

¿alguien tiene uno?

Pues según el google (yo de este tema no tengo idea) los Mac utilizan el #13 en lugar del #10, pero algunos programas, sobre todo los de consola, utilizan el #10 en vez del #13, precisamente por provenir de donde provienen :confused: Así que yo por lo menos me quedo como estaba.

seoane 31-08-2006 20:24:03

Cita:

Empezado por roman
No te detengas hombre. La verdad es que este tipo de rutinas pueden ser muy útiles y si se requieren para procesar muchos archivos y grandes, hacerlo en ensamblador puede ser una muy buena idea.

Código Delphi [-]
function Quitar13(Source: PChar; Dest: PChar): Integer;
asm
        MOV     Result,0
        DEC     EAX
@@SIG:
        INC     EAX
        CMP     BYTE PTR [EAX],0
        JE      @@SALIR
        MOV     CL,[EAX]
        CMP     CL,13
        JE      @@SIG
        MOV     BYTE PTR [EDX],CL
        INC     EDX
        INC     Result
        JMP     @@sig
@@SALIR:
        MOV     BYTE PTR [EDX],0
end;

function SaveToUnixFile(Filename, Text: String): Boolean;
var
  F: File;
  Escritos: Integer;
  P: PChar;
  i: integer;
begin
  Result:= FALSE;
  P:= PChar(Text);
  i:= Quitar13(P,P);
  AssignFile(F,Filename);
  {$I-}
    Rewrite(F,1);
  {$I+}
  if IOResult = 0 then
  begin
    BlockWrite(F,P^,i,Escritos);
    Result:= Escritos = i;
    CloseFile(F);
  end;
end;

roman 31-08-2006 20:36:38

¡Estupendo! :D

Una pregunta, supongo que EAX y EDX "apuntan" a Source y Dest. Ésto, ¿cómo lo sabes? Si hubiera más parámetros, ¿cuáles registros se usarían?

// Saludos

seoane 31-08-2006 20:56:33

Cita:

Empezado por roman
Una pregunta, supongo que EAX y EDX "apuntan" a Source y Dest. Ésto, ¿cómo lo sabes? Si hubiera más parámetros, ¿cuáles registros se usarían?

Cita:

Empezado por Ayuda de Delphi
Under the register convention, up to three parameters are passed in CPU registers, and the rest (if any) are passed on the stack. The parameters are passed in order of declaration (as with the pascal convention), and the first three parameters that qualify are passed in the EAX, EDX, and ECX registers, in that order. Real, method-pointer, variant, Int64, and structured types) do not qualify as register parameters, but all other parameters do. If more than three parameters qualify as register parameters, the first three are passed in EAX, EDX, and ECX, and the remaining parameters are pushed onto the stack in order of declaration.

Resumiendo, si se usa la directiva register (es la que se utiliza por defecto) a la hora de declarar la funcion, los 3 primeros parametros se pasan en los registros EAX, EDX y ECX, en ese mismo orden, y el resto en la pila.


La franja horaria es GMT +2. Ahora son las 23:39:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi