Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con salto de linea, ayuda please! (https://www.clubdelphi.com/foros/showthread.php?t=44281)

jorgegetafe 02-06-2007 02:10:24

Problema con salto de linea, ayuda please!
 
Estoy haciendo un programa, que lee de un fichero de texto, y necesito enterarme cuando lee un salto de linea, para hacer unas cosas, el hecho es que no se como enterarme de ello, ya que no se comparar lo que leo con un salto de linea.

Quiero hacer algo tal que asi:

while not eof (fichero) do begin

read (fichero, caracter);

if caracter = "salto de linea" then

procedure........ end;

¿Como hago esa comparacion ("if caracter = "salto de linea")?


muchas gracias.

seoane 02-06-2007 02:16:36

En windows el salto de linea se corresponde con dos caracteres #13 y #10, en otros sistemas como linux solo se utiliza el #10.

Es decir:
Código Delphi [-]
if caracter = #10 then

jorgegetafe 04-06-2007 01:11:16

He puesto lo que me habeis dicho y el programa no funciona, os paso el codigo a ver si me podeis ayudar, lo que quiero es que cuando encuentre un 'do' y luego venga un salto de carro lo transforme a 'DO'

Código Delphi [-]
UNIT unit_do;

INTERFACE

  TYPE
    fichero = text;

  VAR
    f, FF: fichero;
    nombreFichero: STRING;
    letra1, letra2, letra3: char;

PROCEDURE MAYUSdo (VAR f, FF: fichero; nombreFichero:STRING);

IMPLEMENTATION

PROCEDURE MAYUSdo (VAR f, FF: fichero; nombreFichero:STRING);
  BEGIN
    WHILE (NOT eof (f)) DO
      BEGIN
        read (f, letra1);
        IF letra1 = 'd' THEN
          BEGIN
            read (f, letra2);
            IF letra2 = 'o' THEN
              BEGIN
                read (f, letra3);
                IF letra3 = #10 THEN
                  BEGIN
                    write (FF,'D');
                    write (FF, 'O');
                    write (FF, ' ');
                  END
                ELSE
                  BEGIN
                    write (FF, letra1);
                    write (FF, letra2);
                    write (FF, letra3);
                  END;
              END
          ELSE
            BEGIN
              write (FF, letra1);
              write (FF, letra2);
            END;
        END
      ELSE
        write (FF, letra1);
    END;
    close (f);
    close (FF);

END;


END.

seoane 04-06-2007 01:38:26

Me parece que no me explique bien, cuando dije que el salto de linea, en windows, se correspondía con los caracteres #13 y #10, me refería a que el salto de linea se representa por los dos juntos, primero el #13 y luego el #10.

Es decir:
Código:

Texto+#13+#10
Así que deberías de usar algo así, ya que el #13 es el primer carácter de los dos en aparecer:
Código Delphi [-]
IF letra3 = #13 THEN

De todas formas, ir leyendo letra a letra se me hace un método poco eficiente. Porque no pruebas con algo así, donde Str es una variable de tipo String:
Código Delphi [-]
  while not Eof(F) do
  begin
    Readln(F,Str);
    if Copy(Str,Length(Str)-1,2) = 'do' then
      Writeln(FF,Copy(Str,1,Length(Str)-2) + 'DO')
    else
      Writeln(FF,Str);
  end;

jorgegetafe 04-06-2007 14:39:40

Gracias, quizás te entendí yo mal.

Voy a probar como tu me has dicho.

jorgegetafe 04-06-2007 15:02:50

Ya he hecho lo que me has dicho de #10+#13, de esta forma si encuentra un 'do' lo convierte en 'DO', que es lo que quiero, he abierto el fichero resultante con el delphi y va de lujo, pero si la unidad se abre como un txt aparece 'DO' seguido de dos cuadritos. ¿Eso puede influir en el código? ¿Hay alguna manera de que no ocurra esto? gracias.

seoane 04-06-2007 15:55:11

Supongo que sigues utilizando el código que pusiste antes, solo cambiaste el "if".

Pues el problema creo que esta parte del código:
Código Delphi [-]
IF letra3 = #13 THEN
BEGIN
  write (FF,'D');
  write (FF, 'O');
  write (FF, ' '); // <-- Aqui el problema
END

Cuando tienes un texto como este:
do+#13#10

Tu lo conviertes a esto:
DO+Espacio+#10

En delphi un simple #10 lo interpreta como un salto de linea, así que sigue funcionando. Pero el bloc de notas, por ejemplo, si que necesita de los dos, así que si solo encuentra un #10 en vez de cambiar de linea muestra un "cuadradito". Creo que el problema se solucionaría con algo así:
Código Delphi [-]
IF letra3 = #13 THEN
BEGIN
  write (FF,'D');
  write (FF, 'O');
  write (FF,#13); // <-- Aqui el cambio
END

jorgegetafe 04-06-2007 17:01:53

Muchiiiiiiiiiiiiiiiisimas gracias, va de perlas.

Es que utilizo mi codigo porque me parece más sencillo (aunque si menos eficiente), y como el algoritmo no es muy complicado lo hace muy rápido.

Gracias por todo.


La franja horaria es GMT +2. Ahora son las 09:59:52.

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