2009-12-15 21 views
11

Pensando en UNIX, Windows y Mac y un flujo de salida (tanto binarios y de texto),¿qué representa std :: endl exactamente en cada plataforma?

¿Qué std::endl representan, es decir <CR><LF>, <LF> o <CR>? ¿O siempre es igual sin importar qué plataforma/compilador?

La razón por la que estoy preguntando es que estoy escribiendo un cliente TCP que habla un protocolo que espera que cada comando termine en <CR><LF>. Así que me pregunto si debo usar std::endl o "\r\n" en mis transmisiones.

EDITAR: Ok, entonces uno vacía el búfer y el otro no. Lo entiendo. Pero si estoy enviando texto a un archivo, ¿es '\n' igual a <LF> o se convierte a <CR><LF> en Windows y <LF> en Unix o no? No veo una respuesta clara todavía.

Respuesta

11

el código:.

stream << std::endl; 

// Is equivalent to: 

stream << "\n" << std::flush; 

Entonces la pregunta es qué es "\ n" asignado también.
En las transmisiones normales no ocurre nada.Pero para las transmisiones de archivos (en modo texto), la "\ n" se asigna a la secuencia de fin de línea. Nota: La lectura convierte la secuencia de fin de línea de la plataforma a '\ n' cuando lee desde un archivo en modo texto.

Así que si está utilizando una transmisión normal, no pasa nada. Si está utilizando una secuencia de archivo, sólo asegúrese de que se abre en modo binario de modo que se aplica una conversión:.

stream << "\r\n"; // <CR><LF> 
2

Citado de la respuesta aceptada en un related question:

Los caracteres de fin de línea que varían no importan, suponiendo que el archivo está abierto en el modo de texto, que es lo que obtienes a menos que pide binario. El programa compilado escribirá lo correcto para el sistema compilado.

La única diferencia es que std :: endl vacía el búfer de salida y '\ n' no. Si no desea que el búfer se vacíe con frecuencia, use '\ n'. Si lo hace (por ejemplo, si desea obtener toda la salida, y el programa es inestable), utiliza std :: endl

En su caso, ya que desea específicamente <CR><LF>, debe utilizar explícitamente \r\n, y luego llame al std::flush() si aún desea vaciar el búfer de salida.

+0

representante por citar la respuesta aceptada a una pregunta víctima? ¿Dónde están los quince o así SO nazis cuando los necesitas? –

+0

@Rob Wells: Pensé en eso, pero decidí que no es diferente de citar otra fuente de referencia en mi respuesta, que es, por supuesto, perfectamente aceptable. Los votos ascendentes son para proporcionar información relevante a la pregunta en cuestión. –

+1

Rob, no veo duplicados. Esta pregunta y la citada son ciertamente similares, pero no son duplicados exactos. Además, James agrega un resumen después de la cita para abordar específicamente esta cuestión. Además, las personas obtienen reputación por citar las respuestas que encuentran en otro lugar todo el tiempo. ¿Debería marcar una diferencia si "en otro lugar" es el mismo sitio web? ¿Estás celoso, o qué? –

0

Parece que su pregunta fue mordida. Cada comando termina en []? Para un protocolo sobre cable, sugeriría usar un delimitador que no varíe según la plataforma. std :: endl podría resolver '\ r \ n' o '\ n \ r' según la plataforma.

+0

verdadero. Tal vez sea más apropiado preguntar cuándo usar '\ r \ n' vs std :: endl? – Matt

4

Utilice stream << "\r\n" (y abra la secuencia en modo binario). stream << std::endl; es equivalente a stream << "\n" << flush;. La "\ n" se puede convertir a "\ r \ n" si el código se ejecuta en Windows, pero no se puede contar con él, al menos un compilador de Windows lo convierte en "\ n \ r". En una Mac, es probable que se convierta en "\ r" y en Unix/Linux y en la mayoría de los sistemas similares, se dejará como "\ n".

+0

Si '\ n' se convierte en' \ r \ n', entonces no ' \ n' ser traducido a '\ r \ r \ n'? Simplemente usar' \ r \ n' no sería suficiente, entonces. También tendría que asegurarse de que la transmisión estuviera en modo binario para suprimir la traducción. –

+0

'\ n' se convierte a lo que sea apropiado en una plataforma determinada, si la secuencia se abre en modo texto (es decir, si no usó el indicador' ios_base :: binary'), y usted _can_ puede contar con ello. –

+0

Por supuesto, si uno necesita '\ r \ n' en la secuencia independientemente de la plataforma, entonces debe usarse' "\ r \ n" 'y, además, la secuencia debe abrirse con' ios_base :: binary'. –

7

estándar de C++ dice que:

llamadas os.put (os.widen ('\ n')), entonces os.flush()

Lo que el '\ n' se convierte en, si se convierte en absoluto, es hacia abajo para el tipo de flujo se utiliza en, además de cualquier modo posible, la corriente puede ser abierto en

Cuestiones relacionadas