¿Por qué Consolar.¿La función WriteLine () pierde algunos caracteres dentro de una cadena?


Tengo una cadena, declarada como:

 string text = "THIS IS LINE ONE "+(Char)(13)+" this is line 2";

Y, sin embargo, Cuando escribo Console.WriteLine(text);,

La salida es:

this is line 2E

¿Por qué sucede este comportamiento? ¿O es porque estoy siendo estúpido y me estoy perdiendo algo obvio?

¿Por qué no se imprime:

THIS IS LINE ONE [CR] //where the CR is a non printed character 
this is line 2

EDITAR

Tenga en cuenta: esto es NO una pregunta de 'cómo agrego un retorno de carro'.

Author: Alexander Bell, 2014-11-28

7 answers

(char)13 es un carro retorno (Al margen izquierdo en la línea actual)

THIS IS LINE ONE \r this is line 2"

Se interpreta como:

Print THIS IS LINE ONE
then *return* and print this is line 2
The overlap is: E
So you see: this is line 2E

 57
Author: Alex K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-28 16:11:53

Así es como se comporta la salida estándar en la consola.

  • "\n" ((Char)10) moverá el recuadro al comienzo de la siguiente línea
  • "\r" ((Char)13) moverá el signo al comienzo de la línea actual

Como tal, los resultados son la primera línea sobrescrita por la segunda línea, dejando solo los caracteres adicionales que la segunda línea no pudo sobrescribir.

Ya que ha aclarado que la cadena / caracteres tienen que ser así para obtener el comportamiento que desea cuando este texto se envía finalmente al lugar al que realmente desea enviarlo, una impresora de matriz de puntos, entonces necesita probar con la impresora misma.

El comportamiento anterior se localiza en la consola estándar. Si envía los mismos caracteres a "salida estándar" pero los ha redirigido a una impresora, lo importante es la definición de la impresora sobre cómo tratar con estos caracteres, y esto puede ser diferente de la consola estándar.

Como tal, el el comportamiento que se ve en la consola estándar es solo eso, el comportamiento de la consola estándar. Necesita probar realmente con la impresora para ver cómo se comporta esto.

 19
Author: Lasse Vågsæther Karlsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-28 16:24:35

Si quieres este comportamiento:

THIS IS LINE ONE [CR] //where the CR is a non printed character 
this is line 2

Necesitas este código:

        char a = (char)10;
        string text = "THIS IS LINE ONE" + a + "this is line 2"

        Console.WriteLine(text);

Un retorno de carro((Char) 13) es un carácter de control o mecanismo utilizado para restablecer la posición de un dispositivo al principio de una línea de texto, debido a que experimenta este comportamiento. Como dije, necesitas (char) 13 para tu caso.

 5
Author: mybirthname,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-04 16:12:29

" Un retorno de carro, a veces conocido como retorno de cartucho y a menudo abreviado a CR, o retorno, es un carácter o mecanismo de control se utiliza para restablecer la posición de un dispositivo al principio de una línea de texto." (fuente)

CR nunca cambia una línea, de hecho, regresa hasta el principio de "THIS IS LINE ONE " e imprime " this is line 2" encima de ella, por lo que se ve el adicional E al final de la oración, ya que la línea uno es un carácter más largo. Esto se hace más claro si elimina los dos espacios de las dos cadenas (último carácter de la primera cadena y primer carácter de la segunda cadena) donde la salida se convierte en "this is line 2NE".

De la misma fuente:

" Ordena a una impresora, u otro sistema de salida como una pantalla, que mover la posición del cursor a la primera posición en el mismo alinear."

Lo que estás buscando no es CR, sino una combinación de CR y LF (line feed): CRLF

 3
Author: trashr0x,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-07 04:59:11

(Char)13 es un retorno de carro , mientras que (Char)10 es un avance de línea. Como otros han dicho, esto significa que (Char) 13 volverá al principio de la línea en la que estás, de modo que para cuando hayas escrito la (más corta) línea 2, estará escrita sobre la primera sección de la cadena - por lo tanto la "E"restante.

Si lo intentas con una segunda cadena más corta, puedes ver esto sucediendo:

string text = "THIS IS LINE ONE " + (Char)13 +"test";
Console.WriteLine(text);

Da salida:

"test IS LINE ONE"

Por lo tanto, para resolver su problema, el correcto el código será:

string text = "THIS IS LINE ONE " + (Char)10 +"test";
Console.WriteLine(text);

Que produce:

THIS IS LINE ONE
this is line 2

Editar:

Originalmente, ya que dijiste que tu impresora requiere que sea un (Char)13, sugerí probar ambos (Char)10 + (Char)13 (o viceversa) para lograr un efecto similar. Sin embargo, gracias a los comentarios extremadamente útiles de Peter M, parece que la marca de impresora que está utilizando de hecho requiere solo un (Char)10 - de acuerdo con el manual, (Char)10 producirá una alimentación de línea y un retorno de carro, que es lo que necesita.

 2
Author: Luna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-28 16:28:08

La salida no es lo que parece. Su programa de terminal le oculta algunos caracteres de los bytes escritos en stdout porque interpreta la presencia de retorno de carro como un comando de diseño de texto (que es, regrese a la izquierda). Un hexdump puede confirmar que la salida es correcta mostrando los mismos bytes de la salida .

using System;
public class Hello1 {
  public static void Main()  {
     string text = "THIS IS LINE ONE "+(Char)(13)+" this is line 2";
     System.Console.WriteLine(text);
   }   
}

Compilar y ejecutar:

$ gmcs a.cs
$ ./a.exe
 this is line 2E
$ ./a.exe | hexdump -C
00000000  54 48 49 53 20 49 53 20  4c 49 4e 45 20 4f 4e 45  |THIS IS LINE ONE|
00000010  20 0d 20 74 68 69 73 20  69 73 20 6c 69 6e 65 20  | . this is line |
00000020  32 0a                                             |2.|
00000022
 2
Author: Nope,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-28 21:05:59

Use string.Concat() para concatenar

string text = String.Concat(...)

Y tratar de imprimir esto

 -2
Author: Anton Kozlovsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-15 16:08:07