2010-03-26 19 views
15

¿Hay alguna manera de utilizar automáticamente el carácter EOL correcto según el sistema operativo utilizado?Fin de línea portátil

Estaba pensando en algo como std::eol?

Sé que es muy fácil usar las directivas de preprocesador, pero es curioso si ya está disponible.

Lo que me interesa es que generalmente tengo algunos mensajes en mis aplicaciones que combino más tarde en una sola cadena y quiero separarlos con un EOL. Sé que podría usar std::stringstream << endl, pero a veces parece ser una exageración en lugar de un apéndice común.

Respuesta

11

std::endl se define para no hacer nada además de escribir '\n' en la secuencia y vaciarla (§27.6.2.7). Flushing está definido para no hacer nada por stringstream, por lo que le queda una forma bonita de decir mystringstream << '\n'. La implementación estándar de la biblioteca en su sistema operativo convierte \n de manera adecuada, por lo que no es su problema.

Por lo tanto, endl ya es lo último en rendimiento y portabilidad, y la única otra cosa que podría desear es << '\n' si está intentando escribir eficientemente en un archivo (no en un flujo de cadenas). Bueno, << '\n' también elimina la llamada virtual sin sentido a stringbuf::flush. A menos que los perfiles muestren que la llamada a la función vacía toma tiempo, no lo piense.

+0

Pensé que el uso de '\ n en todas partes es totalmente correcto y SO (leer Windows) lo maneja automáticamente para que se convierta en \ r \ n cuando escribo en la consola y en los archivos. Para mí es más que suficiente en este punto. – Andrew

+0

@Potatoswatter: tal vez lo que estaba señalando (suponiendo que sea el estándar de C++) ahora es la sección §27.7.3.8? – sturmer

+0

@sturmer Sí, es una referencia a C++ 03 que estaba vigente en ese momento. Los números cambian, pero la sección se llama [lib.ostream.manip]. De todos modos, no hay nada realmente que ver allí. Solo dice "Efectos: llamadas' os.put (os.widen ('\ n')) ', luego' os.flush() '." – Potatoswatter

2

Sólo tiene que abrir un archivo en modo texto

FILE *fp = fopen("your_file.txt", "w+t"); 

y luego

fprintf(fp, "some string and integer %d\n", i); 
fclose(fp); 

y el sistema operativo se hará cargo de la EOL en consecuencia a sus normas.

+7

Cómo ... C de usted :-) – paxdiablo

+1

Eheh soy de la vieja escuela XD –

+2

Ahora que ha olvidado cerrar el archivo. : P – GManNickG

10

Si desea escribir un separador de línea a una corriente:

std::cout << '\n'; 

o

std::cout << "\n"; 

o

std::cout << "whatever you were going to say anyway\n"; 

Si la corriente es el modo de texto y el sistema operativo utiliza nada que no sea LF como separador, se convertirá.

Si desea escribir un separador de línea y eliminar la corriente:

std::cout << std::endl; 

Si tiene salida en modo binario por cualquier razón, y desea escribir un salto de línea específica de la plataforma, entonces creo puede que tenga que hacerlo indirectamente (escriba '\n' en una secuencia de texto y luego examínelo en modo binario para ver lo que obtiene). Posiblemente haya alguna forma de obtener directamente la secuencia de salto de línea de la implementación, que no conozco. No es una gran idea, de todos modos: si está escribiendo o leyendo un archivo en modo binario, entonces debe estar en un formato que defina los saltos de línea independientemente del sistema operativo, o que no tenga líneas en absoluto. Ese es el modo binario que es para.

1

Bueno, el STL tiene std :: endl, que se puede utilizar como

std::cout << "Hi five!" << std::endl; 

Tenga en cuenta que además de la adición de una línea de fondo, std :: endl también vacía el búfer, lo que puede tener consecuencias no deseadas de rendimiento.

+1

Err ... eso no es STL, eso es iostreams. –

+0

Estoy de acuerdo con BillyONeal. Además, cuando solo quieres un ''\ n'', simplemente escribe'' \ n'', no 'std :: endl'. Una vez he visto una aceleración por un factor de 8 después de reemplazar innecesariamente 'std :: endl' por' '\ n''. – sbi

+0

Oh, no sabía que esas son entidades separadas. Acabo de asumir que porque comparten el espacio de nombres. Gracias por la corrección. – dimatura

1

Los archivos, incluso los archivos de texto, a menudo se transfieren entre máquinas, por lo que el "nuevo carácter de línea específico del os" es un oxímoron.

Aunque es cierto que los sistemas operativos tienen algo que decir al respecto, particularmente un sistema operativo conocido como Windows, aunque muchos programas de Windows leerán \ n archivos espaciados correctamente, a pesar de que el control de edición winapi multiline no lo haría. Le sugiero que considere dos veces lo que es correcto para usted: no es necesariamente lo que su sistema operativo recomienda. Si sus archivos alguna vez serán almacenados en medios extraíbles, no use el estándar del sistema operativo. Use el estándar global, 0xA.